From 870c689a052c50c660697891f9ba033d09562d87 Mon Sep 17 00:00:00 2001 From: Janaina <jsk22@inf.ufpr.br> Date: Thu, 3 Apr 2025 10:57:30 -0300 Subject: [PATCH] Issue #65-FIX_collection-routes --- .env.example | 12 ++++----- docker-compose.yml | 2 +- ...e_wolfpack.sql => 0000_nappy_wolfpack.sql} | 0 src/db/migrations/meta/0000_snapshot.json | 2 +- src/db/migrations/meta/_journal.json | 4 +-- src/db/repo/collections.repo.ts | 20 +++++++++----- src/db/repo/resource.repo.ts | 2 +- src/db/repo/user-collection.repo.ts | 22 +++++++++++++++ src/routes/collections.route.ts | 27 ++++++++++++++++++- src/routes/resource.route.ts | 4 +-- src/routes/user-collection.route.ts | 22 ++++++++++++++- src/services/collections.service.ts | 5 ++++ src/services/user-collection.service.ts | 4 +++ 13 files changed, 105 insertions(+), 21 deletions(-) rename src/db/migrations/{0000_square_wolfpack.sql => 0000_nappy_wolfpack.sql} (100%) diff --git a/.env.example b/.env.example index 3a13959..9faf0fb 100644 --- a/.env.example +++ b/.env.example @@ -7,15 +7,15 @@ MAILER_PORT=25 DB_USER=postgres DB_PASSWORD=postgres DB_NAME=hono_db -DB_PORT=5432 +DB_PORT=5433 DB_URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} -URL=postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} +URL=https://mecred.c3sl.ufpr.br/ # secret -APP_SECRET=0crebI8PUWwj9E+GRzIGpBt64MwY9ufkBzBkYSH2v+Y= +APP_SECRET= #s3 -AWS_ACCESS_KEY_ID=ACCESS_KEY -AWS_SECRET_ACCESS_KEY=SECRET_KEY +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= AWS_REGION=default -S3_BUCKET=BUCKET_NAME +S3_BUCKET=mecredteste diff --git a/docker-compose.yml b/docker-compose.yml index 87f5403..54f8f92 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - - "5432:5432" + - "5433:5432" networks: - apex_network volumes: diff --git a/src/db/migrations/0000_square_wolfpack.sql b/src/db/migrations/0000_nappy_wolfpack.sql similarity index 100% rename from src/db/migrations/0000_square_wolfpack.sql rename to src/db/migrations/0000_nappy_wolfpack.sql diff --git a/src/db/migrations/meta/0000_snapshot.json b/src/db/migrations/meta/0000_snapshot.json index 0de0331..156b710 100644 --- a/src/db/migrations/meta/0000_snapshot.json +++ b/src/db/migrations/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "id": "0ad63f02-9e60-4b45-85a0-3b8096d0223d", + "id": "9c23b9d5-4c93-4758-bd46-cd0e95cfd455", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json index 6109c64..bcc08a2 100644 --- a/src/db/migrations/meta/_journal.json +++ b/src/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "7", - "when": 1743429134832, - "tag": "0000_square_wolfpack", + "when": 1743432081845, + "tag": "0000_nappy_wolfpack", "breakpoints": true } ] diff --git a/src/db/repo/collections.repo.ts b/src/db/repo/collections.repo.ts index eae48a3..f7cc1ff 100644 --- a/src/db/repo/collections.repo.ts +++ b/src/db/repo/collections.repo.ts @@ -7,11 +7,12 @@ import type { import db from ".."; import collectionTable, { collectionSchemas } from "../schema/collections.schema"; import { and, eq, isNull } from 'drizzle-orm' -import type { ResourceModel } from "../schema/resource.schema"; +import resourceTable, { resourceSchema, type ResourceModel } from "../schema/resource.schema"; import fs from 'fs'; import path from 'path'; import archiver from 'archiver'; import { PassThrough } from "stream"; +import { collectionResourcesTable } from "../schema"; @Service() @@ -121,10 +122,17 @@ export class CollectionRepo { ) } - // async downloadCollection(collectionId: CollectionModel['id']): Promise <Buffer> { - // try { + async getCollectionResources(id: CollectionModel['id']): Promise<ResourceModel[]> { + return await db + .select() + .from(resourceTable) + .innerJoin( + collectionResourcesTable, + eq(resourceTable.id, collectionResourcesTable.resource_id) + ) + .where(eq(collectionResourcesTable.collection_id, id)) + .then((rows) => rows.map((row) => row.resources)); // Ajusta a estrutura do retorno + + } - // fazer zip - // } - // } } \ No newline at end of file diff --git a/src/db/repo/resource.repo.ts b/src/db/repo/resource.repo.ts index 3342db2..03d2bc3 100644 --- a/src/db/repo/resource.repo.ts +++ b/src/db/repo/resource.repo.ts @@ -4,7 +4,6 @@ import db from '..' import resourceTable from "../schema/resource.schema"; import { eq, sql, and } from 'drizzle-orm' - @Service() export class ResourceRepo { async create(resource: ResourceInput @@ -103,5 +102,6 @@ export class ResourceRepo { return resourceSchema.model.array().parse(await db.query.resourceTable.findMany({ where: eq(resourceTable.state, "accepted") })) } + } \ No newline at end of file diff --git a/src/db/repo/user-collection.repo.ts b/src/db/repo/user-collection.repo.ts index 618f26e..cbbbf9c 100644 --- a/src/db/repo/user-collection.repo.ts +++ b/src/db/repo/user-collection.repo.ts @@ -120,4 +120,26 @@ export class userCollectionsRepo { throw error; } } + + async getOwnerCollection(collectionId: CollectionModel['id']): Promise<UserModel | null> { + try { + const owner = await db + .select({ + id: userTable.id, + name: userTable.name, + email: userTable.email, + description: userTable.description, + }) + .from(collectionTable) + .innerJoin(userTable, eq(collectionTable.user_id, userTable.id)) + .where(eq(collectionTable.id, collectionId)) + + + return owner; + } catch (error) { + console.error("Erro ao buscar o dono da coleção:", error); + throw new Error("Erro ao obter o dono da coleção"); + } + } + } \ No newline at end of file diff --git a/src/routes/collections.route.ts b/src/routes/collections.route.ts index c413eb6..5a6e9e1 100644 --- a/src/routes/collections.route.ts +++ b/src/routes/collections.route.ts @@ -10,11 +10,14 @@ import { CollectionStatsService } from "@/services/collection-stats.service"; import { getFile } from "@/services/s3.service"; import archiver from "archiver"; // Biblioteca para criar ZIPs import { CollectionResourcesService } from "@/services/collection-resources.service"; +import { ResourceService } from "@/services/resource.service"; +import { addObjectTypeNameArray } from "./resource.route"; const service = Container.get(CollectionsService); const serviceStats = Container.get(CollectionStatsService); const serviceResourceCollection = Container.get(CollectionResourcesService) ; +const resourceService = Container.get(ResourceService) export const collectionsRouter = honoWithJwt() .post( @@ -372,4 +375,26 @@ export const getCollections = new Hono() 500 ); } - }); \ No newline at end of file + }) + .get("/:id/resources", + async(c) => { + try { + const id = +c.req.param('id') + + const resources = await service.getCollectionResources(id) + const processedResources = await addObjectTypeNameArray(resources) + return c.json({ resources: processedResources }); + } catch (e) { + return c.json( + createApexError({ + status: 'error', + message: 'could not find collection', + code: HttpStatus.BAD_REQUEST, + path: c.req.routePath, + suggestion: 'check the input and try again', + }), + HttpStatus.NOT_FOUND + ) + } + } + ) \ No newline at end of file diff --git a/src/routes/resource.route.ts b/src/routes/resource.route.ts index 14c06c3..7e9e769 100644 --- a/src/routes/resource.route.ts +++ b/src/routes/resource.route.ts @@ -26,7 +26,7 @@ type ResourceWithObjectTypeName = ResourceModel & { }; //funcao para adicionar o nome do objectType a um array de recursos -async function addObjectTypeNameArray(resources: ResourceModel[]): Promise<ResourceWithObjectTypeName[]> { +export async function addObjectTypeNameArray(resources: ResourceModel[]): Promise<ResourceWithObjectTypeName[]> { return Promise.all(resources.map(async (resource) => { // Buscar o nome do objectType relacionado ao recurso const objectType = await objectTypeService.findById(resource.object_type_id); @@ -375,4 +375,4 @@ export const publicResourceRouter = new Hono() 500 ); } - }); + }); \ No newline at end of file diff --git a/src/routes/user-collection.route.ts b/src/routes/user-collection.route.ts index 108435e..5ee498b 100644 --- a/src/routes/user-collection.route.ts +++ b/src/routes/user-collection.route.ts @@ -98,7 +98,7 @@ export const publicUserCollectionsRoutes = new Hono() } } ) - .get('/collection/:collectionId/users', + .get(':collectionId/users', async (c) => { try { const collectionId = +c.req.param('collectionId'); @@ -118,3 +118,23 @@ export const publicUserCollectionsRoutes = new Hono() } } ) + .get('/:id/owner', + async (c) => { + try { + const id = +c.req.param('id'); + const owner = await service.getOwnerCollection(id); + return c.json(owner, HttpStatus.OK); + } catch (e) { + return c.json( + createApexError({ + status: 'error', + message: 'Failed to fetch owner', + code: HttpStatus.BAD_REQUEST, + path: c.req.routePath, + suggestion: 'Check the input and try again', + }), + HttpStatus.BAD_REQUEST + ) + } + } + ) \ No newline at end of file diff --git a/src/services/collections.service.ts b/src/services/collections.service.ts index c843d03..85b2fbf 100644 --- a/src/services/collections.service.ts +++ b/src/services/collections.service.ts @@ -5,6 +5,7 @@ import type { CollectionModel, CollectionUpdate } from '@/db/schema/collections.schema' +import type { ResourceModel } from '@/db/schema/resource.schema' @Service() export class CollectionsService { @@ -57,4 +58,8 @@ export class CollectionsService { return this.repo.getPrivateCollectionsByUser(id) } + async getCollectionResources (id: CollectionModel['id']): Promise <ResourceModel[]> { + return this.repo.getCollectionResources(id) + } + } \ No newline at end of file diff --git a/src/services/user-collection.service.ts b/src/services/user-collection.service.ts index 8c8de31..cea3666 100644 --- a/src/services/user-collection.service.ts +++ b/src/services/user-collection.service.ts @@ -27,4 +27,8 @@ export class UserCollectionsService { async getUsersByCollection(collectionId: CollectionModel['id']): Promise<UserModel[]> { return this.repo.getUsersByCollection(collectionId); } + + async getOwnerCollection(collectionId: CollectionModel['id']): Promise<UserModel> { + return this.repo.getOwnerCollection(collectionId) + } } \ No newline at end of file -- GitLab