This commit is contained in:
Clément Pons 2025-12-16 15:41:35 +01:00
commit 78a101b79d
10 changed files with 22 additions and 20 deletions

View File

@ -1,7 +1,6 @@
import { Database } from "bun:sqlite"; import { Database } from "bun:sqlite";
import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite"; import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite";
import * as schema from '../db/schema'; import * as schema from '../db/schema';
import { eq, or, sql } from "drizzle-orm";
let instance: BunSQLiteDatabase<typeof schema> & { let instance: BunSQLiteDatabase<typeof schema> & {
$client: Database; $client: Database;

View File

@ -18,7 +18,7 @@ interface Parser
} }
export default function useMarkdown(): Parser export default function useMarkdown(): Parser
{ {
let processor: Processor, processorSync: Processor; let processor: Processor, processorText: Processor;
const parse = (markdown: string) => { const parse = (markdown: string) => {
if (!processor) if (!processor)
@ -43,14 +43,14 @@ export default function useMarkdown(): Parser
} }
const text = (markdown: string) => { const text = (markdown: string) => {
if (!processor) if (!processorText)
{ {
processor = unified().use([RemarkParse, RemarkGfm, RemarkOfm, RemarkBreaks, RemarkFrontmatter ]); processorText = unified().use([RemarkParse, RemarkGfm, RemarkOfm, RemarkBreaks, RemarkFrontmatter ]);
processor.use(StripMarkdown, { remove: [ 'comment', 'tag', 'callout' ] }); processorText.use(StripMarkdown, { remove: [ 'comment', 'tag', 'callout' ] });
processor.use(RemarkStringify); processorText.use(RemarkStringify);
} }
const processed = processor.processSync(markdown); const processed = processorText.processSync(markdown);
return String(processed); return String(processed);
} }

BIN
db.sqlite

Binary file not shown.

View File

@ -74,7 +74,7 @@ export default defineEventHandler(async (e): Promise<Return> => {
logSession(e, await setUserSession(e, { user: { id: id.id, username: body.data.username, email: body.data.email, state: 0, signin: new Date(), permissions: [], lastTimestamp: new Date() } }) as UserSessionRequired); logSession(e, await setUserSession(e, { user: { id: id.id, username: body.data.username, email: body.data.email, state: 0, signin: new Date(), permissions: [], lastTimestamp: new Date() } }) as UserSessionRequired);
const emailId = Bun.hash('register' + id.id + hash, Date.now()); const emailId = Bun.hash('register' + id.id + hash, Date.now()).toString(10);
const timestamp = Date.now() + 1000 * 60 * 60; const timestamp = Date.now() + 1000 * 60 * 60;
await runTask('validation', { await runTask('validation', {
@ -90,7 +90,7 @@ export default defineEventHandler(async (e): Promise<Return> => {
template: 'registration', template: 'registration',
data: { data: {
id: emailId, timestamp, id: emailId, timestamp,
userId: id, userId: id.id,
username: body.data.username, username: body.data.username,
}, },
} }

View File

@ -24,7 +24,7 @@ export default defineEventHandler(async (e) => {
if(result && result.id) if(result && result.id)
{ {
const id = hash('reset' + result.id + result.hash, Date.now()); const id = hash('reset' + result.id + result.hash, Date.now()).toString(10);
const timestamp = Date.now() + 1000 * 60 * 60; const timestamp = Date.now() + 1000 * 60 * 60;
await runTask('validation', { await runTask('validation', {
payload: { payload: {

View File

@ -47,7 +47,7 @@ export default defineEventHandler(async (e) => {
return; return;
} }
const emailId = hash('register' + data.id + data.hash, Date.now()); const emailId = hash('register' + data.id + data.hash, Date.now()).toString(10);
const timestamp = Date.now() + 1000 * 60 * 60; const timestamp = Date.now() + 1000 * 60 * 60;
await runTask('validation', { await runTask('validation', {

View File

@ -1,4 +1,5 @@
import { dom, text } from "#shared/dom.virtual.util"; import { dom, text } from "#shared/dom.virtual.util";
import { format } from "#shared/general.util";
export default function(data: any) export default function(data: any)
{ {

View File

@ -16,6 +16,8 @@ export default defineEventHandler(async (e) => {
if(!query.success) if(!query.success)
throw query.error; throw query.error;
const date = new Date();
if(Bun.hash('1' + query.data.u.toString(), query.data.t).toString() !== query.data.h) if(Bun.hash('1' + query.data.u.toString(), query.data.t).toString() !== query.data.h)
{ {
return createError({ return createError({
@ -23,7 +25,7 @@ export default defineEventHandler(async (e) => {
message: 'Lien incorrect', message: 'Lien incorrect',
}); });
} }
if(Date.now() > query.data.t + (60 * 60 * 1000)) if(date.getTime() > query.data.t + (60 * 60 * 1000))
{ {
return createError({ return createError({
statusCode: 400, statusCode: 400,
@ -34,7 +36,7 @@ export default defineEventHandler(async (e) => {
const db = useDatabase(); const db = useDatabase();
const validate = db.select(getTableColumns(emailValidationTable)).from(emailValidationTable).where(eq(emailValidationTable.id, query.data.i)).get(); const validate = db.select(getTableColumns(emailValidationTable)).from(emailValidationTable).where(eq(emailValidationTable.id, query.data.i)).get();
if(!validate || validate.timestamp <= new Date()) if(!validate || validate.timestamp <= date)
{ {
return createError({ return createError({
statusCode: 400, statusCode: 400,
@ -42,7 +44,7 @@ export default defineEventHandler(async (e) => {
}); });
} }
db.delete(emailValidationTable).where(lte(emailValidationTable.timestamp, new Date())).run(); db.delete(emailValidationTable).where(lte(emailValidationTable.timestamp, date)).run();
const result = db.select({ state: usersTable.state }).from(usersTable).where(eq(usersTable.id, query.data.u)).get(); const result = db.select({ state: usersTable.state }).from(usersTable).where(eq(usersTable.id, query.data.u)).get();
if(result === undefined) if(result === undefined)

View File

@ -14,18 +14,18 @@ export default defineTask({
name: 'validation', name: 'validation',
description: 'Add email ID to DB', description: 'Add email ID to DB',
}, },
run(e) { run({ payload, context }) {
try { try {
if(e.payload.type !== 'validation') if(payload.type !== 'validation')
{ {
throw new Error(`Données inconnues`); throw new Error(`Données inconnues`);
} }
const payload = e.payload as ValidationPayload; const _payload = payload as ValidationPayload;
const db = useDatabase(); const db = useDatabase();
db.delete(emailValidationTable).where(lt(emailValidationTable.timestamp, new Date())).run(); db.delete(emailValidationTable).where(lt(emailValidationTable.timestamp, new Date())).run();
db.insert(emailValidationTable).values({ id: payload.id, timestamp: new Date(payload.timestamp) }).run(); db.insert(emailValidationTable).values({ id: _payload.id, timestamp: new Date(_payload.timestamp) }).run();
return { result: true }; return { result: true };
} }

View File

@ -3,7 +3,7 @@ import { z } from "zod/v4";
import characterConfig from '#shared/character-config.json'; import characterConfig from '#shared/character-config.json';
import proses, { preview } from "#shared/proses"; import proses, { preview } from "#shared/proses";
import { button, buttongroup, checkbox, floater, foldable, input, loading, multiselect, numberpicker, select, tabgroup, Toaster, toggle } from "#shared/components.util"; import { button, buttongroup, checkbox, floater, foldable, input, loading, multiselect, numberpicker, select, tabgroup, Toaster, toggle } from "#shared/components.util";
import { div, dom, icon, span, text, type DOMList, type RedrawableHTML } from "#shared/dom.util"; import { div, dom, icon, span, text, reactive, type DOMList, type RedrawableHTML } from "#shared/dom.util";
import { followermenu, fullblocker, tooltip } from "#shared/floating.util"; import { followermenu, fullblocker, tooltip } from "#shared/floating.util";
import { clamp, deepEquals } from "#shared/general.util"; import { clamp, deepEquals } from "#shared/general.util";
import markdown from "#shared/markdown.util"; import markdown from "#shared/markdown.util";
@ -1301,7 +1301,7 @@ export class CharacterSheet
useRequestFetch()(`/api/character/${id}`).then(character => { useRequestFetch()(`/api/character/${id}`).then(character => {
if(character) if(character)
{ {
this.character = new CharacterCompiler(character); this.character = new CharacterCompiler(reactive(character));
if(character.campaign) if(character.campaign)
{ {