From fb36ef35fcbd7f4e774d7d8a777f316294593419 Mon Sep 17 00:00:00 2001 From: Andreas Korth Date: Mon, 6 Nov 2023 21:14:48 +0100 Subject: [PATCH] wip: add session and user models --- src/session.ts | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/test.ts | 51 +++++--------------------------------------------- src/user.ts | 21 +++++++++++++++++++++ 3 files changed, 72 insertions(+), 46 deletions(-) create mode 100644 src/session.ts create mode 100644 src/user.ts diff --git a/src/session.ts b/src/session.ts new file mode 100644 index 0000000..9f17335 --- /dev/null +++ b/src/session.ts @@ -0,0 +1,46 @@ +import { defineModel, zod, $ } from '.' +import { SupamodelError } from './errors' +import User from './user' +import { asData, failWith } from './util' + +export interface Credentials { + email: string + password: string +} + +const { custom, string, number } = zod + +export class Session extends defineModel({ + access_token: $(string()), + tokenType: $(string()), + expiresIn: $(number()), + expiresAt: $(number()), + refreshToken: $(string()), + user: $( + custom((val: unknown) => val instanceof User, { + message: 'Invalid User', + params: { code: 'invalid-user' }, + }), + { + take: (data) => User.take(data), + emit: (user) => user.$emit(), + }, + ), +}) { + static async signInWithPassword(credentials: Credentials) { + const { data, error } = + await this.client.auth.signInWithPassword(credentials) + if (error) throw error + + // console.dir(data, { depth: 6 }) + return this.take(data.session) + } + + static async getUser() { + const { data, error } = await this.client.auth.getUser() + if (error) return failWith(SupamodelError, error) + + return asData(User.take(data.user)) + } +} +export default Session diff --git a/src/test.ts b/src/test.ts index c46880f..e33e3c4 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,54 +1,13 @@ import 'dotenv/config' import './luxon.inspect.custom' -import { defineModel, datetime, transform, $, zod, configureSupamodel } from '.' +import Session from './session' +import { configureSupamodel } from '.' configureSupamodel({}) -interface Credentials { - email: string - password: string -} - -const { object, string } = zod - -class User extends defineModel({ - id: $(string()), - email: $(string().email()), - aud: $(string()), - role: $(string()), - emailConfirmedAt: $(datetime(), transform.datetime), - phone: $(string()), - confirmedAt: $(datetime(), transform.datetime), - recoverySentAt: $(datetime(), transform.datetime), - lastSignInAt: $(datetime(), transform.datetime), - appMetadata: $(object({}).passthrough()), - userMetadata: $(object({}).passthrough()), - identities: $(object({}).passthrough().array()), - createdAt: $(datetime(), transform.datetime), - updatedAt: $(datetime(), transform.datetime), -}) { - static async signInWithPassword(credentials: Credentials) { - const { data, error } = - await this.client.auth.signInWithPassword(credentials) - if (error) throw error - - // console.dir(data, { depth: 6 }) - return this.take(data.user) - } - - static async instance() { - const { data, error } = await this.client.auth.getUser() - if (error) throw error - - return this.take(data.user) - } -} - -User.signInWithPassword({ +Session.signInWithPassword({ email: 'andreas.korth@gmail.com', password: 'rosebush', -}).then(async (user) => { - console.log(user.toJSON()) - console.log('\ninstance:') - console.log((await User.instance()).toJSON()) +}).then(async (session) => { + console.dir(session.toJSON(), { depth: 5 }) }) diff --git a/src/user.ts b/src/user.ts new file mode 100644 index 0000000..615de8a --- /dev/null +++ b/src/user.ts @@ -0,0 +1,21 @@ +import { defineModel, datetime, transform, zod, $ } from '.' + +const { object, string } = zod + +export class User extends defineModel({ + id: $(string()), + email: $(string().email()), + aud: $(string()), + role: $(string()), + emailConfirmedAt: $(datetime(), transform.datetime), + phone: $(string()), + confirmedAt: $(datetime(), transform.datetime), + recoverySentAt: $(datetime(), transform.datetime), + lastSignInAt: $(datetime(), transform.datetime), + appMetadata: $(object({}).passthrough()), + userMetadata: $(object({}).passthrough()), + identities: $(object({}).passthrough().array()), + createdAt: $(datetime(), transform.datetime), + updatedAt: $(datetime(), transform.datetime), +}) {} +export default User