diff --git a/migrations/0001_magical_harry_osborn.sql b/migrations/0001_magical_harry_osborn.sql index 35bcade..a45f5ea 100644 --- a/migrations/0001_magical_harry_osborn.sql +++ b/migrations/0001_magical_harry_osborn.sql @@ -1,4 +1,8 @@ -ALTER TABLE `users` RENAME COLUMN `username` TO `stagehandle`;--> statement-breakpoint -DROP INDEX IF EXISTS `users_username_unique`;--> statement-breakpoint -ALTER TABLE `users` ADD `private` integer DEFAULT true NOT NULL;--> statement-breakpoint -CREATE UNIQUE INDEX `users_stagehandle_unique` ON `users` (`stagehandle`); \ No newline at end of file +ALTER TABLE `users` +RENAME COLUMN `username` TO `stagehandle`; + +DROP INDEX IF EXISTS `users_username_unique`; + +ALTER TABLE `users` ADD `private` integer DEFAULT true NOT NULL; + +CREATE UNIQUE INDEX `users_stagehandle_unique` ON `users` (`stagehandle`); diff --git a/package-lock.json b/package-lock.json index 2353760..ce21074 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "date-fns": "^3.6.0" }, "devDependencies": { + "@faker-js/faker": "^9.0.3", "@playwright/test": "^1.28.1", "@sveltejs/adapter-cloudflare": "^4.7.2", "@sveltejs/kit": "^2.0.0", @@ -1181,6 +1182,23 @@ "license": "MIT", "optional": true }, + "node_modules/@faker-js/faker": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.3.tgz", + "integrity": "sha512-lWrrK4QNlFSU+13PL9jMbMKLJYXDFu3tQfayBsMXX7KL/GiQeqfB1CzHkqD5UHBUtPAuPo6XwGbMFNdVMZObRA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, "node_modules/@fastify/busboy": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", diff --git a/package.json b/package.json index 8781aac..359baa1 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "**/*": "prettier --write --ignore-unknown" }, "devDependencies": { + "@faker-js/faker": "^9.0.3", "@playwright/test": "^1.28.1", "@sveltejs/adapter-cloudflare": "^4.7.2", "@sveltejs/kit": "^2.0.0", diff --git a/src/lib/server/db/users.ts b/src/lib/server/db/users.ts index 16f3b6c..6d34f1f 100644 --- a/src/lib/server/db/users.ts +++ b/src/lib/server/db/users.ts @@ -15,6 +15,7 @@ export async function fetchManyUsers(params?: { offset?: number; limit?: number; includeDeleted?: boolean; + includePrivate?: boolean; }): Promise { const users = await db .select() @@ -24,6 +25,7 @@ export async function fetchManyUsers(params?: { .where( and( params?.includeDeleted ? undefined : isNull(usersTable.deletedAt), + params?.includePrivate ? undefined : eq(usersTable.isPrivate, false), like(usersTable.stagehandle, '%' + (params?.stageHandle ?? '') + '%') ) ) diff --git a/src/lib/utils/faker/index.ts b/src/lib/utils/faker/index.ts new file mode 100644 index 0000000..884e394 --- /dev/null +++ b/src/lib/utils/faker/index.ts @@ -0,0 +1,8 @@ +import { Faker, en } from '@faker-js/faker'; + +export function generateFakeStagehandle(id?: number): string { + const faker = new Faker({ locale: [en] }); + faker.seed(id); + const name = faker.person.firstName().toLowerCase(); + return name; +} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 6df2f6c..92c1543 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -7,9 +7,24 @@ import { redirect } from '@sveltejs/kit'; import { issueJWT, checkPassword } from '$lib/server/crypto'; import { fetchUserWithPasswordByStageHandle } from '$lib/server/db/users'; import { LoginSchema } from '$lib/utils'; +import { generateFakeStagehandle } from '$lib/utils/faker'; export const load: PageServerLoad = async ({ url }) => { - const users = await fetchManyUsers(); + const rawUsers = await fetchManyUsers({ includePrivate: true, limit: 10 }); + const users = rawUsers.map((u) => { + if (u.isPrivate) { + return { + isPrivate: true, + stagehandle: `?${generateFakeStagehandle(u.id)}?`, + createdAt: u.createdAt + }; + } + return { + isPrivate: false, + stagehandle: u.stagehandle, + createdAt: u.createdAt + }; + }); const form = await superValidate(zod(LoginSchema)); const isSignup = url.searchParams.get('signup') === '1'; return { diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 344d15d..3550cd3 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -89,12 +89,23 @@

Recently Joined {JOINED}

- {#each data.users as user} - - @{user.stagehandle} joined - - {/each} + {#if data.users.length > 0} + {#each data.users as user} + {#if !user.isPrivate} + + @{user.stagehandle} joined + + {:else} + @{user.stagehandle} joined + + + {/if} + {/each} + {:else} + Please be the first? + {/if}
{:else} diff --git a/src/routes/signup/+page.svelte b/src/routes/signup/+page.svelte index 5493166..cb4557a 100644 --- a/src/routes/signup/+page.svelte +++ b/src/routes/signup/+page.svelte @@ -11,6 +11,7 @@ import { superForm } from 'sveltekit-superforms'; import { CHECKED } from '$lib/characters'; import H2 from '$lib/components/H2.svelte'; + import { generateFakeStagehandle } from '$lib/utils/faker'; export let data: PageData; const { form, allErrors, capture, restore, constraints, delayed, enhance } = superForm( @@ -41,7 +42,7 @@ id="stagehandle" name="stagehandle" type="text" - placeholder="Name generator coming soon..." + placeholder={generateFakeStagehandle()} bind:value={$form.stagehandle} {...$constraints.stagehandle} />