feature: start to lay groundwork for reactions

This commit is contained in:
Andy Burke 2025-10-12 16:25:42 -07:00
parent 10b3e9ff72
commit 6500d9a9be
4 changed files with 56 additions and 5 deletions

View file

@ -1,6 +1,9 @@
import { by_character, by_lurid } from '@andyburke/fsdb/organizers';
import { FSDB_COLLECTION } from '@andyburke/fsdb';
import { FSDB_INDEXER_SYMLINKS } from '@andyburke/fsdb/indexers';
import { EMOJI_MAP as JS_EMOJI_MAP } from '../public/js/emojis/en.js';
const EMOJI_MAP: Record<string, string[]> = JS_EMOJI_MAP;
/**
* @typedef {object} TIMESTAMPS
@ -110,7 +113,37 @@ export function VALIDATE_EVENT(event: EVENT) {
});
}
break;
case 'reaction':
if (typeof event.parent_id !== 'string') {
errors.push({
cause: 'reaction_missing_parent_id',
message: 'A reaction must have a parent_id that refers to another event.'
});
} else if (typeof event.data?.reaction !== 'string') {
errors.push({
cause: 'reaction_must_be_an_emoji',
message: 'A reaction event must have a `data.reaction` that is an emoji.'
});
} else if (typeof EMOJI_MAP[event.data.reaction] === 'undefined') {
errors.push({
cause: 'reaction_must_be_an_emoji',
message: 'A reaction event must have a `data.reaction` that is an emoji.'
});
}
break;
case 'test':
if (Deno.env.get('DENO_ENV') !== 'test') {
errors.push({
cause: 'unknown_event_type',
message: 'Event types allowed: ' + ['chat', 'post', 'blurb', 'essay', 'reaction'].join(', ')
});
}
break;
default:
errors.push({
cause: 'unknown_event_type',
message: 'Event types allowed: ' + ['chat', 'post', 'blurb', 'essay', 'reaction'].join(', ')
});
break;
}

View file

@ -8,7 +8,7 @@ export type INVITE_CODE = {
code: string;
timestamps: {
created: string;
expires?: string;
expires: string;
cancelled?: string;
};
};
@ -30,7 +30,7 @@ export const INVITE_CODES = new FSDB_COLLECTION<INVITE_CODE>({
}
});
// TODO: separate out these different validators somewhere?
const MAX_INVITE_EXPIRE_TIME = 28 * 24 * 60 * 60 * 1_000;
export function VALIDATE_INVITE_CODE(invite_code: INVITE_CODE) {
const errors: any[] = [];
@ -41,7 +41,6 @@ export function VALIDATE_INVITE_CODE(invite_code: INVITE_CODE) {
});
}
// TODO: further invite code validation
if (typeof invite_code.code !== 'string' || invite_code.id.length < 3) {
errors.push({
cause: 'invalid_invite_code_code',
@ -49,5 +48,20 @@ export function VALIDATE_INVITE_CODE(invite_code: INVITE_CODE) {
});
}
if (typeof invite_code.timestamps?.expires !== 'string') {
errors.push({
cause: 'missing_invite_expiration',
message: 'Invite codes must have an expiration set.'
});
}
const expiration_delta = new Date(invite_code.timestamps.expires).valueOf() - new Date(invite_code.timestamps.created).valueOf();
if (expiration_delta > MAX_INVITE_EXPIRE_TIME || expiration_delta < 0) {
errors.push({
cause: 'invite_expiration_invalid',
message: 'Invite codes must expire within a limited window after they are created.'
});
}
return errors.length ? errors : undefined;
}