Fix registration email and add no character friendly messages
This commit is contained in:
parent
443612cc58
commit
72843f2425
BIN
db.sqlite-shm
BIN
db.sqlite-shm
Binary file not shown.
BIN
db.sqlite-wal
BIN
db.sqlite-wal
Binary file not shown.
|
|
@ -35,7 +35,8 @@ async function duplicateCharacter(id: number)
|
||||||
<div v-if="status === 'pending'" class="flex flex-1 justify-center align-center">
|
<div v-if="status === 'pending'" class="flex flex-1 justify-center align-center">
|
||||||
<Loading size="large" />
|
<Loading size="large" />
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="status === 'success'" class="grid p-6 2xl:grid-cols-3 lg:grid-cols-2 grid-cols-1 gap-4 w-full">
|
<template v-else-if="status === 'success'">
|
||||||
|
<div v-if="characters && characters.length > 0" class="grid p-6 2xl:grid-cols-3 lg:grid-cols-2 grid-cols-1 gap-4 w-full">
|
||||||
<div class="flex flex-col w-[360px] border border-light-35 dark:border-dark-35" v-for="character of characters">
|
<div class="flex flex-col w-[360px] border border-light-35 dark:border-dark-35" v-for="character of characters">
|
||||||
<NuxtLink :to="{ name: 'character-id', params: { id: character.id } }" class="group bg-light-10 dark:bg-dark-10 border-b border-light-35 dark:border-dark-35 p-2 flex flex-col gap-2">
|
<NuxtLink :to="{ name: 'character-id', params: { id: character.id } }" class="group bg-light-10 dark:bg-dark-10 border-b border-light-35 dark:border-dark-35 p-2 flex flex-col gap-2">
|
||||||
<div class="flex flex-row gap-8 ps-4 items-center">
|
<div class="flex flex-row gap-8 ps-4 items-center">
|
||||||
|
|
@ -75,6 +76,18 @@ async function duplicateCharacter(id: number)
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else class="flex flex-col gap-2 items-center flex-1">
|
||||||
|
<span class="text-lg font-bold">Vous n'avez pas encore de personnage</span>
|
||||||
|
<NuxtLink class="inline-flex justify-center items-center outline-none leading-none transition-[box-shadow]
|
||||||
|
text-light-100 dark:text-dark-100 bg-light-20 dark:bg-dark-20 border border-light-40 dark:border-dark-40
|
||||||
|
hover:bg-light-25 dark:hover:bg-dark-25 hover:border-light-50 dark:hover:border-dark-50
|
||||||
|
focus:bg-light-30 dark:focus:bg-dark-30 focus:border-light-50 dark:focus:border-dark-50 focus:shadow-raw focus:shadow-light-50 dark:focus:shadow-dark-50 py-2 px-4" :to="{ name: 'character-id-edit', params: { id: 'new' } }">Nouveau personnage</NuxtLink>
|
||||||
|
<NuxtLink class="inline-flex justify-center items-center outline-none leading-none transition-[box-shadow]
|
||||||
|
text-light-100 dark:text-dark-100 bg-light-20 dark:bg-dark-20 border border-light-40 dark:border-dark-40
|
||||||
|
hover:bg-light-25 dark:hover:bg-dark-25 hover:border-light-50 dark:hover:border-dark-50
|
||||||
|
focus:bg-light-30 dark:focus:bg-dark-30 focus:border-light-50 dark:focus:border-dark-50 focus:shadow-raw focus:shadow-light-50 dark:focus:shadow-dark-50 py-2 px-4" :to="{ name: 'character-list' }">Qu'ont fait les autres ?</NuxtLink>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<span>Erreur de chargement</span>
|
<span>Erreur de chargement</span>
|
||||||
<span>{{ error?.message }}</span>
|
<span>{{ error?.message }}</span>
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ const config = characterConfig as CharacterConfig;
|
||||||
<div v-if="status === 'pending'" class="flex flex-1 justify-center align-center">
|
<div v-if="status === 'pending'" class="flex flex-1 justify-center align-center">
|
||||||
<Loading size="large" />
|
<Loading size="large" />
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="status === 'success'" class="grid p-6 2xl:grid-cols-3 lg:grid-cols-2 grid-cols-1 gap-4 w-full">
|
<template v-else-if="status === 'success'">
|
||||||
|
<div v-if="characters && characters.length > 0" class="grid p-6 2xl:grid-cols-3 lg:grid-cols-2 grid-cols-1 gap-4 w-full">
|
||||||
<div class="flex flex-col w-[360px] border border-light-35 dark:border-dark-35" v-for="character of characters">
|
<div class="flex flex-col w-[360px] border border-light-35 dark:border-dark-35" v-for="character of characters">
|
||||||
<NuxtLink :to="{ name: 'character-id', params: { id: character.id } }" class="group bg-light-10 dark:bg-dark-10 p-2 flex flex-col gap-2">
|
<NuxtLink :to="{ name: 'character-id', params: { id: character.id } }" class="group bg-light-10 dark:bg-dark-10 p-2 flex flex-col gap-2">
|
||||||
<div class="flex flex-row gap-8 ps-4 items-center">
|
<div class="flex flex-row gap-8 ps-4 items-center">
|
||||||
|
|
@ -31,6 +32,15 @@ const config = characterConfig as CharacterConfig;
|
||||||
</NuxtLink>
|
</NuxtLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else class="flex flex-col gap-2 items-center flex-1">
|
||||||
|
<span class="text-lg font-bold">Il n'existe pas encore de personnage public</span>
|
||||||
|
Soyez le premier à partager vos créations !
|
||||||
|
<NuxtLink class="inline-flex justify-center items-center outline-none leading-none transition-[box-shadow]
|
||||||
|
text-light-100 dark:text-dark-100 bg-light-20 dark:bg-dark-20 border border-light-40 dark:border-dark-40
|
||||||
|
hover:bg-light-25 dark:hover:bg-dark-25 hover:border-light-50 dark:hover:border-dark-50
|
||||||
|
focus:bg-light-30 dark:focus:bg-dark-30 focus:border-light-50 dark:focus:border-dark-50 focus:shadow-raw focus:shadow-light-50 dark:focus:shadow-dark-50 py-2 px-4" :to="{ name: 'character-id-edit', params: { id: 'new' } }">Nouveau personnage</NuxtLink>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<span>Erreur de chargement</span>
|
<span>Erreur de chargement</span>
|
||||||
<span>{{ error?.message }}</span>
|
<span>{{ error?.message }}</span>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import { usersDataTable, usersTable } from '~/db/schema';
|
||||||
import { schema } from '~/schemas/registration';
|
import { schema } from '~/schemas/registration';
|
||||||
import { checkSession, logSession } from '~/server/utils/user';
|
import { checkSession, logSession } from '~/server/utils/user';
|
||||||
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
||||||
import sendMail from '~/server/tasks/mail';
|
|
||||||
import type { $ZodIssue } from 'zod/v4/core';
|
import type { $ZodIssue } from 'zod/v4/core';
|
||||||
|
|
||||||
interface SuccessHandler
|
interface SuccessHandler
|
||||||
|
|
@ -84,7 +83,7 @@ export default defineEventHandler(async (e): Promise<Return> => {
|
||||||
id: emailId, timestamp,
|
id: emailId, timestamp,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await sendMail({
|
await runTask('mail', {
|
||||||
payload: {
|
payload: {
|
||||||
type: 'mail',
|
type: 'mail',
|
||||||
to: [body.data.email],
|
to: [body.data.email],
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@ export default defineEventHandler(async (e) => {
|
||||||
let where: ((character: typeof characterTable._.config.columns, sql: Operators) => SQL | undefined) | undefined = undefined;
|
let where: ((character: typeof characterTable._.config.columns, sql: Operators) => SQL | undefined) | undefined = undefined;
|
||||||
const db = useDatabase();
|
const db = useDatabase();
|
||||||
|
|
||||||
|
const session = await getUserSession(e);
|
||||||
if(visibility === "own")
|
if(visibility === "own")
|
||||||
{
|
{
|
||||||
const session = await getUserSession(e);
|
|
||||||
if(!session.user)
|
if(!session.user)
|
||||||
{
|
{
|
||||||
setResponseStatus(e, 401);
|
setResponseStatus(e, 401);
|
||||||
|
|
@ -33,7 +33,6 @@ export default defineEventHandler(async (e) => {
|
||||||
}
|
}
|
||||||
else if(visibility === 'admin')
|
else if(visibility === 'admin')
|
||||||
{
|
{
|
||||||
const session = await getUserSession(e);
|
|
||||||
if(!session.user)
|
if(!session.user)
|
||||||
{
|
{
|
||||||
setResponseStatus(e, 401);
|
setResponseStatus(e, 401);
|
||||||
|
|
@ -73,7 +72,7 @@ export default defineEventHandler(async (e) => {
|
||||||
people: character.people,
|
people: character.people,
|
||||||
level: character.level,
|
level: character.level,
|
||||||
aspect: character.aspect,
|
aspect: character.aspect,
|
||||||
notes: character.notes,
|
notes: { public: character.public_notes, private: session.user?.id === character.owner ? character.private_notes : undefined },
|
||||||
variables: character.variables,
|
variables: character.variables,
|
||||||
|
|
||||||
training: character.training.reduce((p, v) => { p[v.stat] ??= {}; p[v.stat][v.level as TrainingLevel] = v.choice; return p; }, {} as Record<MainStat, Partial<Record<TrainingLevel, number>>>),
|
training: character.training.reduce((p, v) => { p[v.stat] ??= {}; p[v.stat][v.level as TrainingLevel] = v.choice; return p; }, {} as Record<MainStat, Partial<Record<TrainingLevel, number>>>),
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,8 @@ export default defineEventHandler(async (e) => {
|
||||||
people: body.data.people!,
|
people: body.data.people!,
|
||||||
level: body.data.level,
|
level: body.data.level,
|
||||||
aspect: body.data.aspect,
|
aspect: body.data.aspect,
|
||||||
notes: body.data.notes,
|
public_notes: body.data.notes.public,
|
||||||
|
private_notes: body.data.notes.private,
|
||||||
variables: body.data.variables,
|
variables: body.data.variables,
|
||||||
visibility: body.data.visibility,
|
visibility: body.data.visibility,
|
||||||
thumbnail: body.data.thumbnail,
|
thumbnail: body.data.thumbnail,
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ export default defineEventHandler(async (e) => {
|
||||||
people: character.people,
|
people: character.people,
|
||||||
level: character.level,
|
level: character.level,
|
||||||
aspect: character.aspect,
|
aspect: character.aspect,
|
||||||
notes: { public: character.public_notes, private: character.private_notes },
|
notes: { public: character.public_notes, private: session.user?.id === character.owner ? character.private_notes : undefined },
|
||||||
variables: character.variables,
|
variables: character.variables,
|
||||||
|
|
||||||
training: character.training.reduce((p, v) => { p[v.stat] ??= {}; p[v.stat][v.level as TrainingLevel] = v.choice; return p; }, {} as Record<MainStat, Partial<Record<TrainingLevel, number>>>),
|
training: character.training.reduce((p, v) => { p[v.stat] ??= {}; p[v.stat][v.level as TrainingLevel] = v.choice; return p; }, {} as Record<MainStat, Partial<Record<TrainingLevel, number>>>),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue