From 27098ec9fab7feb9617126897327e75eea63f0cf Mon Sep 17 00:00:00 2001 From: john Date: Sun, 18 May 2025 21:20:32 +0200 Subject: [PATCH] update authservice --- src/App.tsx | 4 +- src/app/api/schema.ts | 83 ++++++++++++++++++++++++++++++++++++- src/app/auth/authService.ts | 40 +++++++++++------- 3 files changed, 108 insertions(+), 19 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8b27c8b..cb89675 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,15 +6,13 @@ import { MediaService } from './app/media/mediaService.ts' import SignupPage from './app/auth/pages/SignupPage.tsx' import LoginPage from './app/auth/pages/LoginPage.tsx' import { AuthService } from './app/auth/authService.ts' -import { useUser } from './app/user/userStore.ts' import LogoutPage from './app/auth/pages/LogoutPage.tsx' import UnauthorizedHandler from './app/auth/components/UnauthorizedHandler.tsx' function App() { - const { user } = useUser() const postService = new PostsService() const mediaService = new MediaService() - const authService = new AuthService(user) + const authService = new AuthService() return ( diff --git a/src/app/api/schema.ts b/src/app/api/schema.ts index 6023ed1..66b0ed1 100644 --- a/src/app/api/schema.ts +++ b/src/app/api/schema.ts @@ -87,8 +87,7 @@ export interface paths { requestBody: { content: { 'multipart/form-data': { - /** Format: binary */ - file?: string + file?: components['schemas']['IFormFile'] } } } @@ -266,6 +265,66 @@ export interface paths { patch?: never trace?: never } + '/auth/signup-codes': { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + get: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody?: never + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown + } + content: { + 'text/plain': components['schemas']['ListSignupCodesResult'] + 'application/json': components['schemas']['ListSignupCodesResult'] + 'text/json': components['schemas']['ListSignupCodesResult'] + } + } + } + } + put?: never + post: { + parameters: { + query?: never + header?: never + path?: never + cookie?: never + } + requestBody: { + content: { + 'application/json': components['schemas']['CreateSignupCodeRequest'] + 'text/json': components['schemas']['CreateSignupCodeRequest'] + 'application/*+json': components['schemas']['CreateSignupCodeRequest'] + } + } + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown + } + content?: never + } + } + } + delete?: never + options?: never + head?: never + patch?: never + trace?: never + } } export type webhooks = Record export interface components { @@ -292,11 +351,21 @@ export interface components { /** Format: uuid */ postId: string } + CreateSignupCodeRequest: { + code: string + email: string + name: string + } GetAllPublicPostsResponse: { posts: components['schemas']['PostDto'][] /** Format: uuid */ next: string | null } + /** Format: binary */ + IFormFile: string + ListSignupCodesResult: { + signupCodes: components['schemas']['SignupCodeDto'][] + } LoginRequest: { username: string password: string @@ -339,6 +408,16 @@ export interface components { userId: string username: string } + SignupCodeDto: { + code: string + email: string + name: string + /** Format: uuid */ + redeemingUserId: string | null + redeemingUsername: string | null + /** Format: date-time */ + expiresOn: string | null + } UploadMediaResponse: { /** Format: uuid */ mediaId: string diff --git a/src/app/auth/authService.ts b/src/app/auth/authService.ts index 0cb3c36..2fb7ed9 100644 --- a/src/app/auth/authService.ts +++ b/src/app/auth/authService.ts @@ -1,16 +1,11 @@ -import { User } from '../user/userStore.ts' import { dispatchMessage } from '../messageBus/messageBus.ts' import client from '../api/client.ts' import { ProblemDetails } from '../../types' export class AuthService { - constructor(private readonly user: User | null) {} + constructor() {} async login(username: string, password: string) { - if (this.user != null) { - throw new Error('already logged in') - } - const res = await client.POST('/auth/login', { body: { username, password }, credentials: 'include', @@ -24,10 +19,6 @@ export class AuthService { } async signup(username: string, password: string, signupCode: string) { - if (this.user != null) { - throw new Error('already logged in') - } - const res = await client.POST('/auth/register', { body: { username, password, signupCode, email: null }, credentials: 'include', @@ -42,12 +33,33 @@ export class AuthService { } async logout() { - if (this.user == null) { - return - } - await client.DELETE('/auth/session', { credentials: 'include' }) dispatchMessage('auth:logged-out', null) } + + async createSignupCode(code: string, email: string, name: string) { + const res = await client.POST('/auth/signup-codes', { + body: { code, email, name }, + credentials: 'include', + }) + + if (!res.data) { + console.error(res.error) + throw new Error('failed to create signup code') + } + } + + async listSignupCodes() { + const res = await client.GET('/auth/signup-codes', { + credentials: 'include', + }) + + if (!res.data) { + console.error(res.error) + throw new Error('error') + } + + return res.data.signupCodes + } }