diff --git a/.env.example b/.env.example index 3a13959ebc9206c1c611af6d3f610afb6bb58ed3..9faf0fba420a7ae3aa5d184553b8442f77f82781 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 87f540393c39a187afb6578f75c011936c753d25..54f8f92ab3070e52457fbe38d559ca45e0e638ae 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 0de0331b6206ba30c7cf095ad5db73bb3d6053a8..156b7107df0e02455672faaf5be2469b75277587 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 6109c64dfcd864617b8e90ece345573b18f7c965..bcc08a2ffe768ddf519e058307464c584081839a 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 eae48a3c92bf11009fc336192a5e270a367812db..f7cc1ffcbfd825d3670bf626947179054fb9f4d6 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 3342db2494405e9a1e764b38ca55f190e421c683..03d2bc374b2c711bbaa04440de63b1f8979249f4 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 618f26eca137a0cd0e4fa2b55206992d24713b0a..cbbbf9c348765220b5fbf2c07880975390e994c6 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 c413eb660938ae6b0317d602ed35653aa2157067..5a6e9e12543e865747c19205b655de664c866527 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 14c06c3d1def43649ae78b5627a77b4a0721e1d2..7e9e7698fa5de38b52ef6475a5b1447d42d6ebf0 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 108435e748d5bcd6ac673683e668a3082211d409..5ee498bc5b917b7cb4cf54576a5f6444f5236048 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 c843d030a5623640007a2abb4a6b695b8bbdfe13..85b2fbf94c20463d19490eee7434124bd414a18b 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 8c8de31c319599f1c6ebe4aadb8158cc7ca7d652..cea36660ca90c4d9a6d96081b5bf70264744290b 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