From 9cae558b3ad8a1fcbc1152b9b6b0b50fb783d59c Mon Sep 17 00:00:00 2001
From: nar20 <nar20@inf.ufpr.br>
Date: Wed, 27 Nov 2024 10:38:22 -0300
Subject: [PATCH] Issue #49: add user routes

---
 README.md                                |  1 +
 src/db/repo/auth.repo.ts                 |  4 ++--
 src/db/repo/collection-resources.repo.ts |  2 +-
 src/db/repo/user.repo.ts                 | 18 +++++++++---------
 src/db/schema/user.schema.ts             | 10 +++++-----
 src/routes/auth.route.ts                 |  8 ++++----
 src/routes/uploader.route.ts             |  2 +-
 src/routes/user-institution.route.ts     | 20 ++++++++++----------
 src/routes/user-item.route.ts            | 20 ++++++++++----------
 src/routes/user-role.route.ts            |  2 +-
 src/routes/user.route.ts                 | 20 ++++++++++----------
 src/services/user.service.ts             |  2 +-
 12 files changed, 55 insertions(+), 54 deletions(-)

diff --git a/README.md b/README.md
index 9ade0d3..14c6014 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@
 
 5. set dev db
    ```
+    bun db:generate
     bun db:migrate
     bun db:seed
    ```
diff --git a/src/db/repo/auth.repo.ts b/src/db/repo/auth.repo.ts
index 2c37d7e..8dfa7bf 100644
--- a/src/db/repo/auth.repo.ts
+++ b/src/db/repo/auth.repo.ts
@@ -16,12 +16,12 @@ export function verifyPassword(
   return Bun.password.verifySync(pass, hash)
 }
 
-export const authSchema = userSchemas.userModelSchema.pick({
+export const authSchema = userSchemas.model.pick({
   username: true,
   password: true,
 })
 
-export const authPayload = userSchemas.userModelSchema.pick({
+export const authPayload = userSchemas.model.pick({
   id: true,
   username: true,
 })
diff --git a/src/db/repo/collection-resources.repo.ts b/src/db/repo/collection-resources.repo.ts
index b2471a0..2301e03 100644
--- a/src/db/repo/collection-resources.repo.ts
+++ b/src/db/repo/collection-resources.repo.ts
@@ -3,7 +3,7 @@ import type { CollectionModel } from "../schema/collection.schema";
 import type { ResourceModel } from "../schema/resource.schema";
 import db from "..";
 import collectionResourcesTable from "../relations/collection-resource.relation";
-import { and, eq, inArray, name } from "drizzle-orm";
+import { and, eq, inArray } from "drizzle-orm";
 import resourceTable from "../schema/resource.schema";
 import collectionTable from "../schema/collection.schema";
 
diff --git a/src/db/repo/user.repo.ts b/src/db/repo/user.repo.ts
index e8356a5..e1ed321 100644
--- a/src/db/repo/user.repo.ts
+++ b/src/db/repo/user.repo.ts
@@ -13,7 +13,7 @@ import { eq } from 'drizzle-orm'
 export class UserRepo {
   async findMany(): Promise<UserModel[]> {
     return z
-      .array(userSchemas.userModelSchema)
+      .array(userSchemas.model)
       .parse(await db.query.userTable.findMany())
   }
 
@@ -26,7 +26,7 @@ export class UserRepo {
 
     if (!user) return null
 
-    return userSchemas.userModelSchema.parse(user)
+    return userSchemas.model.parse(user)
   }
 
   async findByUsername(
@@ -38,7 +38,7 @@ export class UserRepo {
 
     if (!user) return null
 
-    return userSchemas.userModelSchema.parse(user)
+    return userSchemas.model.parse(user)
   }
 
   async findByEmail(
@@ -50,7 +50,7 @@ export class UserRepo {
 
     if(!user) return null
 
-    return userSchemas.userModelSchema.parse(user)
+    return userSchemas.model.parse(user)
   }
 
   async create(user: UserInput, tx?: db): Promise<UserModel> {
@@ -61,7 +61,7 @@ export class UserRepo {
       .values(user)
       .returning()
 
-    return userSchemas.userModelSchema.parse(ret)
+    return userSchemas.model.parse(ret)
   }
 
   async createMany(
@@ -71,14 +71,14 @@ export class UserRepo {
     const repo = tx ?? db
 
     return z
-      .array(userSchemas.userModelSchema)
+      .array(userSchemas.model)
       .parse(await repo.insert(userTable).values(users).returning())
   }
 
   async uploadUsers(users: UserInput[]): Promise<UserModel[]> {
     return await db.transaction(async (tx) => {
       return z
-        .array(userSchemas.userModelSchema)
+        .array(userSchemas.model)
         .parse(await tx.insert(userTable).values(users).returning())
     })
   }
@@ -90,7 +90,7 @@ export class UserRepo {
       .where(eq(userTable.id, user.id))
       .returning()
 
-      return userSchemas.userModelSchema.parse(ret)
+      return userSchemas.model.parse(ret)
   }
 
   async delete(id: UserModel['id']): Promise<UserModel>{
@@ -99,7 +99,7 @@ export class UserRepo {
     .where(eq(userTable.id, id))
     .returning()
 
-    return userSchemas.userModelSchema.parse(ret)
+    return userSchemas.model.parse(ret)
   }
 
 }
diff --git a/src/db/schema/user.schema.ts b/src/db/schema/user.schema.ts
index f0b89c6..cce754d 100644
--- a/src/db/schema/user.schema.ts
+++ b/src/db/schema/user.schema.ts
@@ -86,11 +86,11 @@ export type UserDto = z.infer<typeof userDtoSchema>
 export type UserProfile = z.infer<typeof userProfileSchema>
 
 export const userSchemas = {
-  userInputSchema,
-  userUpdateSchema,
-  userModelSchema,
-  userDtoSchema,
-  userProfileSchema
+  input: userInputSchema,
+  update: userUpdateSchema,
+  model: userModelSchema,
+  dto: userDtoSchema,
+  profile: userProfileSchema
 }
 
 export default userTable
diff --git a/src/routes/auth.route.ts b/src/routes/auth.route.ts
index ce9b45b..c4e50db 100644
--- a/src/routes/auth.route.ts
+++ b/src/routes/auth.route.ts
@@ -41,14 +41,14 @@ export const authRouter = new Hono().post(
   }
 )
 .post('/signup',
-  zValidator('json', userSchemas.userInputSchema),
+  zValidator('json', userSchemas.input),
   async (c) => {
     try {
       const input = await c.req.valid('json')
       
       const userStats = userStatsSchemas.dto.parse(await userStatsService.create())
       input.user_stats_id = userStats.id
-      const user = userSchemas.userDtoSchema.parse(
+      const user = userSchemas.dto.parse(
         await userService.create(input)
       )
 
@@ -61,7 +61,7 @@ export const authRouter = new Hono().post(
   async (c) => {
     try{
       const email: string = c.req.param('email')
-      const user = userSchemas.userDtoSchema.parse(
+      const user = userSchemas.dto.parse(
         await userService.findByEmail(email)
       )
 
@@ -147,7 +147,7 @@ export const authRouter = new Hono().post(
         */
       user.password = password[0]
       
-      const ret = userSchemas.userDtoSchema.parse(
+      const ret = userSchemas.dto.parse(
         await userService.update(user)
       )
               
diff --git a/src/routes/uploader.route.ts b/src/routes/uploader.route.ts
index 21992e8..fa64685 100644
--- a/src/routes/uploader.route.ts
+++ b/src/routes/uploader.route.ts
@@ -34,7 +34,7 @@ export const uploaderRouter = honoWithJwt().post(
       }
 
       await service.uploadUsers(
-        z.array(userSchemas.userInputSchema).parse(users)
+        z.array(userSchemas.input).parse(users)
       )
 
       return c.json({ message: 'uploaded' })
diff --git a/src/routes/user-institution.route.ts b/src/routes/user-institution.route.ts
index 823a73b..3e9c287 100644
--- a/src/routes/user-institution.route.ts
+++ b/src/routes/user-institution.route.ts
@@ -19,9 +19,9 @@ export const userInstitutionRouter = honoWithJwt()
     async (c) => {
       try{
         const input = await c.req.valid('json')
-        let user = await userService.findById(input.user_id)
-        let institution = await institutionService.findById(input.institution_id) //tinha que ver questão de um usuario sem ser admin poder criar um admin
-        let alreadyInstitution = await service.findByUserInstitution(input) != 0        
+        const user = await userService.findById(input.user_id)
+        const institution = await institutionService.findById(input.institution_id) //tinha que ver questão de um usuario sem ser admin poder criar um admin
+        const alreadyInstitution = await service.findByUserInstitution(input) != 0        
         if(user == null || institution == null || alreadyInstitution){
           throw new Error()
         }
@@ -50,10 +50,10 @@ export const userInstitutionRouter = honoWithJwt()
     try{
       const user_id = +c.req.param('user_id')
       const institutions_by_user = z.array(userInstitutionRelationSchemas.model).parse(await service.findByUserId(user_id))
-      var institutions: InstitutionModel[] = []
+      const institutions: InstitutionModel[] = []
 
-      for(var element of institutions_by_user){
-        let institution = await institutionService.findById(element.institution_id)
+      for(const element of institutions_by_user){
+        const institution = await institutionService.findById(element.institution_id)
         if(institution != null)
           institutions.push(institutionSchemas.dto.parse(institution))
       }
@@ -69,12 +69,12 @@ export const userInstitutionRouter = honoWithJwt()
       const institution_id = +c.req.param('institution_id')
       const users_by_institution = z.array(userInstitutionRelationSchemas.model).parse(await service.findByInstitutionId(institution_id))
       
-      var users: UserProfile[] = []
+      const users: UserProfile[] = []
 
-      for(var element of users_by_institution){
-        let user = await userService.findById(element.user_id)
+      for(const element of users_by_institution){
+        const user = await userService.findById(element.user_id)
         if(user != null)
-          users.push(userSchemas.userProfileSchema.parse(user))
+          users.push(userSchemas.profile.parse(user))
       }
       
       
diff --git a/src/routes/user-item.route.ts b/src/routes/user-item.route.ts
index ce11239..7ce1687 100644
--- a/src/routes/user-item.route.ts
+++ b/src/routes/user-item.route.ts
@@ -19,9 +19,9 @@ export const userItemRouter = honoWithJwt()
     async (c) => {
       try{
         const input = await c.req.valid('json')
-        let user = await userService.findById(input.user_id)
-        let item = await itemService.findById(input.item_id) //tinha que ver questão de um usuario sem ser admin poder criar um admin
-        let alreadyItem = await service.findByUserItem(input) != 0        
+        const user = await userService.findById(input.user_id)
+        const item = await itemService.findById(input.item_id) //tinha que ver questão de um usuario sem ser admin poder criar um admin
+        const alreadyItem = await service.findByUserItem(input) != 0        
         if(user == null || item == null || alreadyItem){
           throw new Error()
         }
@@ -47,10 +47,10 @@ export const userItemRouter = honoWithJwt()
     try{
       const user_id = +c.req.param('user_id')
       const items_by_user = z.array(userItemRelationSchemas.model).parse(await service.findByUserId(user_id))
-      var items: ItemsModel[] = []
+      const items: ItemsModel[] = []
 
-      for(var element of items_by_user){
-        let item = await itemService.findById(element.item_id)
+      for(const element of items_by_user){
+        const item = await itemService.findById(element.item_id)
         if(item != null)
           items.push(itemsSchema.dto.parse(item))
       }
@@ -66,12 +66,12 @@ export const userItemRouter = honoWithJwt()
       const item_id = +c.req.param('item_id')
       const users_by_item = z.array(userItemRelationSchemas.model).parse(await service.findByItemId(item_id))
       
-      var users: UserProfile[] = []
+      const users: UserProfile[] = []
 
-      for(var element of users_by_item){
-        let user = await userService.findById(element.user_id)
+      for(const element of users_by_item){
+        const user = await userService.findById(element.user_id)
         if(user != null)
-          users.push(userSchemas.userProfileSchema.parse(user))
+          users.push(userSchemas.profile.parse(user))
       }
       
       
diff --git a/src/routes/user-role.route.ts b/src/routes/user-role.route.ts
index c2caaf8..dc2d5a4 100644
--- a/src/routes/user-role.route.ts
+++ b/src/routes/user-role.route.ts
@@ -71,7 +71,7 @@ export const userRoleRouter = honoWithJwt()
       for(const element of users_by_role){
         const user = await userService.findById(element.user_id)
         if(user != null)
-          users.push(userSchemas.userProfileSchema.parse(user))
+          users.push(userSchemas.profile.parse(user))
       }
       
       
diff --git a/src/routes/user.route.ts b/src/routes/user.route.ts
index c817ccd..ec13c8c 100644
--- a/src/routes/user.route.ts
+++ b/src/routes/user.route.ts
@@ -104,7 +104,7 @@ export const userRouter = honoWithJwt()
       for(const element of follows_id){
         const follow = await service.findById(element.follower_id)
         if(follow != null)
-          follows.push(userSchemas.userProfileSchema.parse(follow))
+          follows.push(userSchemas.profile.parse(follow))
       }
       
       return c.json({ follows })
@@ -122,7 +122,7 @@ export const userRouter = honoWithJwt()
       for(const element of followers_id){
         const follow = await service.findById(element.follower_id)
         if(follow != null)
-          followers.push(userSchemas.userProfileSchema.parse(follow))
+          followers.push(userSchemas.profile.parse(follow))
       }
       
       return c.json({ followers })
@@ -138,7 +138,7 @@ export const userRouter = honoWithJwt()
 
     const users = await service.findMany()
 
-    const ret = z.array(userSchemas.userDtoSchema).parse(users)
+    const ret = z.array(userSchemas.dto).parse(users)
 
     return c.json({ users: ret })
   })  
@@ -146,7 +146,7 @@ export const userRouter = honoWithJwt()
     try {
       const username = c.req.param('username')
       const user = await service.findByUsername(username)
-      const ret = userSchemas.userDtoSchema.parse(user)
+      const ret = userSchemas.dto.parse(user)
 
       return c.json({ user: ret })
     } catch {
@@ -154,12 +154,12 @@ export const userRouter = honoWithJwt()
     }
   })  
   .post('/update',
-    zValidator('json', userSchemas.userUpdateSchema),
+    zValidator('json', userSchemas.update),
     async (c) => {
       try {
         const input = await c.req.valid('json')
 
-        const user = userSchemas.userDtoSchema.parse(
+        const user = userSchemas.dto.parse(
           await service.update(input)
         )
         
@@ -189,7 +189,7 @@ export const userRouter = honoWithJwt()
 
         user.confirmed_at = service.getUpdateTime()
         
-        const confirmed_user = userSchemas.userDtoSchema.parse(
+        const confirmed_user = userSchemas.dto.parse(
           await service.update(user)
         )
 
@@ -219,7 +219,7 @@ export const userRouter = honoWithJwt()
         
         user.reactivated_at = service.getUpdateTime()
         
-        const reactivated_user = userSchemas.userDtoSchema.parse(
+        const reactivated_user = userSchemas.dto.parse(
           await service.update(user)
         )
 
@@ -249,7 +249,7 @@ export const userRouter = honoWithJwt()
         
         user.deleted_at = service.getUpdateTime()
         
-        const deleted_user = userSchemas.userDtoSchema.parse(
+        const deleted_user = userSchemas.dto.parse(
           await service.update(user)
         )
 
@@ -271,7 +271,7 @@ export const userRouter = honoWithJwt()
     async (c) => {
       try {
         const id: number = +c.req.param('id')
-        const user = userSchemas.userDtoSchema.parse(
+        const user = userSchemas.dto.parse(
           await service.systemDelete(id)
         )
 
diff --git a/src/services/user.service.ts b/src/services/user.service.ts
index c75d879..1f6bc4f 100644
--- a/src/services/user.service.ts
+++ b/src/services/user.service.ts
@@ -59,7 +59,7 @@ export class UserService {
     }
 
     return this.repo.createMany(
-      z.array(userSchemas.userInputSchema).parse(users),
+      z.array(userSchemas.input).parse(users),
       tx
     )
   }
-- 
GitLab