Skip to content

Commit

Permalink
✨ complete user cartridge coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
acidjazz committed Aug 22, 2024
1 parent 34f3d88 commit 796e281
Show file tree
Hide file tree
Showing 13 changed files with 180 additions and 134 deletions.
2 changes: 2 additions & 0 deletions app/utils/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,5 @@ export const shotUnits = [
25,
50,
]

export const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ CREATE TABLE `shots` (
`userId` BIGINT NOT NULL,
`cartridgeId` BIGINT NOT NULL,
`units` INTEGER NOT NULL,
`date` DATE NOT NULL,
`date` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,

Expand Down
50 changes: 26 additions & 24 deletions prisma/schema/meds.prisma
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@

model Cartridge {
id BigInt @id @default(autoincrement())
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
content String
ml Decimal
mg Decimal
shots Shot[]
pen Pen?
user User @relation(fields: [userId], references: [id])
content String
ml Decimal
mg Decimal
shots Shot[]
pen Pen?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("cartridges")
}

model Pen {
id BigInt @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId BigInt
cartridge Cartridge? @relation(fields: [cartridgeId], references: [id], onDelete: Restrict )
cartridgeId BigInt? @unique
color String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
id BigInt @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId BigInt
cartridge Cartridge? @relation(fields: [cartridgeId], references: [id], onDelete: Restrict)
cartridgeId BigInt? @unique
color String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("pens")
}

model Shot {
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
cartridgeId BigInt
cartridge Cartridge @relation(fields: [cartridgeId], references: [id], onDelete: Cascade, onUpdate: Cascade )
units Int
date DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
cartridge Cartridge @relation(fields: [cartridgeId], references: [id], onDelete: Cascade, onUpdate: Cascade)
units Int
date DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("shots")
}
4 changes: 2 additions & 2 deletions prisma/schema/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
provider = "prisma-client-js"
previewFeatures = ["prismaSchemaFolder"]
binaryTargets = ["native", "rhel-openssl-3.0.x"]
binaryTargets = ["native", "rhel-openssl-3.0.x"]
}

datasource db {
Expand Down
61 changes: 32 additions & 29 deletions prisma/schema/user.prisma
Original file line number Diff line number Diff line change
@@ -1,44 +1,47 @@
model User {
id BigInt @id @default(autoincrement())
email String @unique
name String?
avatar String? @db.VarChar(1600)
providers Provider[]
sessions Token[]
pens Pen[]
cartridges Cartridge[]
shots Shot[]
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
id BigInt @id @default(autoincrement())
email String @unique
name String?
avatar String? @db.VarChar(1600)
providers Provider[]
sessions Token[]
pens Pen[]
cartridges Cartridge[]
shots Shot[]
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("users")
}

model Provider {
id BigInt @id @default(autoincrement())
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
name String?
avatar String? @db.VarChar(1600)
payload Json
user User @relation(fields: [userId], references: [id])
name String?
avatar String? @db.VarChar(1600)
payload Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("providers")
@@unique([userId, name])
@@map("providers")
}

model Token {
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
hash String @unique
source String
ip String
agent String
location Json
id BigInt @id @default(autoincrement())
userId BigInt
user User @relation(fields: [userId], references: [id])
hash String @unique
source String
ip String
agent String
location Json
// coordinate Unsupported("Point")
coordinate String @default("30.2423 -97.7672")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
coordinate String @default("30.2423 -97.7672")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("tokens")
}
30 changes: 11 additions & 19 deletions server/controllers/cartridge.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { z } from 'zod'
import type { Cartridge } from '~/types/models'
import { cartridgeContents, cartridgeMgs, cartridgeMls } from '~/utils/shared'

const index = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const index = authedHandler(async ({ user, event }) => {
return metapi().render(
await prisma.cartridge.findMany({
where: {
Expand All @@ -16,8 +16,7 @@ const index = defineEventHandler(async (event) => {
)
})

const create = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const create = authedHandler(async ({ user, event }) => {
const schema = z.object({
content: z.enum(cartridgeContents as [string, ...string[]]),
ml: z.enum(cartridgeMls as [string, ...string[]]),
Expand All @@ -37,26 +36,19 @@ const create = defineEventHandler(async (event) => {
return metapi().success('cartridge created', cartridge)
})

const get = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const schema = z.object({ id: z.number() })
const parsed = schema.safeParse({ id: event.context.params?.id })
if (!parsed.success) return metapi().error(event, parsed.error.issues, 403)
const get = authedModelHandler<Cartridge>(async ({ event, user, model: cartridge }) => {
if (Number(cartridge.userId) !== Number(user.id))
return metapi().error(event, 'Unauthorized', 401)

return metapi().renderNullError(event, await prisma.cartridge.findUnique({
where: {
id: parsed.data.id,
userId: user.id,
},
}))
return metapi().render(cartridge)
})

const remove = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const id = event.context.params?.id
const remove = authedModelHandler<Cartridge>(async ({ event, user, model: cartridge }) => {
if (Number(cartridge.userId) !== Number(user.id))
return metapi().error(event, 'Unauthorized', 401)
await prisma.cartridge.delete({
where: {
id: Number.parseInt(id as string),
id: cartridge.id,
userId: user.id,
},
})
Expand Down
29 changes: 10 additions & 19 deletions server/controllers/token.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { z } from 'zod'
import type { Token } from '~/types/models'

const index = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
console.log('we are passed requireUserSession')
const index = authedHandler(async ({ user, event }) => {
return metapi().render(
await prisma.$extends({
result: {
Expand All @@ -21,26 +20,18 @@ const index = defineEventHandler(async (event) => {
)
})

const get = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const schema = z.object({ id: z.number() })
const parsed = schema.safeParse({ id: event.context.params?.id })
if (!parsed.success) return metapi().error(event, parsed.error.issues, 403)

return metapi().renderNullError(event, await prisma.token.findUnique({
where: {
id: parsed.data.id,
userId: user.id,
},
}))
const get = authedModelHandler<Token>(async ({ user, event, model: token }) => {
if (Number(token.userId) !== Number(user.id))
return metapi().error(event, 'Unauthorized', 401)
return metapi().renderNullError(event, token)
})

const remove = defineEventHandler(async (event) => {
const { user } = await requireUserSession(event)
const id = event.context.params?.id
const remove = authedModelHandler<Token>(async ({ user, event, model: token }) => {
if (token.userId !== user.id)
return metapi().error(event, 'Unauthorized', 401)
await prisma.token.delete({
where: {
id: Number.parseInt(id as string),
id: token.id,
userId: user.id,
},
})
Expand Down
2 changes: 1 addition & 1 deletion server/utils/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export function authedModelHandler<T>(

return authedHandler(async ({ user, event }) => {
const model = await handleModelLookup(event, mergedOptions, user)
if (mergedOptions.admin && !user.isAdmin) return metapi().notFound(event)
if (model === null || (mergedOptions.admin && !user.isAdmin)) return metapi().notFound(event)
return handler({ user, event, model })
})
}
70 changes: 32 additions & 38 deletions server/utils/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,52 +8,46 @@ import type { TokenLocation, UserInfo } from '~/types/oauth'
export const createUser = async (info: UserInfo, provider: string, oauthPayload: any, event?: H3Event): Promise<User> => {
let user: User | null = null

user = await prisma.user.findUnique({
where: {
user = await prisma.user.upsert({
where: { email: info.email },
create: {
email: info.email,
},
}) as unknown as User

if (!user)
user = await prisma.user.create({
data: {
email: info.email,
name: info.name,
avatar: info.avatar,
payload: (info.payload ? info.payload : ({ roles: { admin: false } } as UserPayload)) as unknown as Prisma.JsonObject,
providers: {
create: [
{
name: info.name,
avatar: info.avatar,
payload: (info.payload ? info.payload : ({ roles: { admin: false } } as UserPayload)) as unknown as Prisma.JsonObject,
providers: {
create: [
{

name: provider,
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},
name: provider,
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},

],
},
],
},
}) as unknown as User
},
update: {},
}) as unknown as User

else
await prisma.provider.upsert({
where: {
userId_name: {
userId: BigInt(user.id),
name: provider,
},
},
update: {
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},
create: {
await prisma.provider.upsert({
where: {
userId_name: {
userId: BigInt(user.id),
name: provider,
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},
})
},
update: {
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},
create: {
userId: BigInt(user.id),
name: provider,
avatar: info.avatar,
payload: oauthPayload as unknown as Prisma.JsonObject,
},
})

const coordinate = event
? `${event.node.req.headers['Cloudfront-Viewer-Latitude']} ${event.node.req.headers['Cloudfront-Viewer-Longitude']}`
Expand Down
4 changes: 3 additions & 1 deletion test/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ async function userFromEmail(email: string): Promise<UserSession> {
if (!users[index]) throw new Error('User not found')
if (!users[index].session?.id)
users[index].session = await createUser(users[index], 'github', {})

return users[index]
}

Expand All @@ -46,7 +47,8 @@ async function actingAs(email: string) {
const get = <T>(url: string) => $fetch<MetapiResponse<T>>(url, { headers: { cookie: user.cookie as string } })
const post = <T>(url: string, params: object) => $fetch<MetapiResponse<T>>(url, { method: 'POST', body: params, headers: { cookie: user.cookie as string } })
const put = <T>(url: string, params: object) => $fetch<MetapiResponse<T>>(url, { method: 'PUT', body: params, headers: { cookie: user.cookie as string } })
return { get, post, put, user }
const remove = <T>(url: string, params?: object) => $fetch<MetapiResponse<T>>(url, { method: 'DELETE', body: params, headers: { cookie: user.cookie as string } })
return { get, post, put, remove, user }
}

export {
Expand Down
Loading

0 comments on commit 796e281

Please sign in to comment.