diff --git a/package-lock.json b/package-lock.json index d8a4db8..62ef66f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3047,6 +3047,14 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -4225,6 +4233,19 @@ "dev": true, "license": "MIT" }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -7378,6 +7399,14 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.15.tgz", + "integrity": "sha512-M7+rtYi9l5RvMmHyjyoF3BHHUpXTYdJ0PezZGHNs0GyW1lO+K7jxlXpbdIb7a56h0nqLYdjIw+E+z0ciGaJP7g==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10096,6 +10125,17 @@ "node": ">=10.12.0" } }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/value-or-promise": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index 359f950..bb6565f 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -1,9 +1,13 @@ -import { Injectable, OnModuleInit } from '@nestjs/common'; +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() -export class PrismaService extends PrismaClient implements OnModuleInit { +export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { async onModuleInit() { await this.$connect(); } + + async onModuleDestroy() { + await this.$disconnect(); + } } diff --git a/src/resolvers/campaign.resolver.ts b/src/resolvers/campaign.resolver.ts index a1dac77..ee97d54 100644 --- a/src/resolvers/campaign.resolver.ts +++ b/src/resolvers/campaign.resolver.ts @@ -1,8 +1,30 @@ -import { Resolver } from '@nestjs/graphql'; +import { Resolver, Query, Args } from '@nestjs/graphql'; import { PrismaService } from 'src/prisma/prisma.service'; import { Campaign } from './models/campaign.model'; +import { NotFoundException, BadRequestException } from '@nestjs/common'; @Resolver(() => Campaign) export class CampaignResolver { constructor(private prismaService: PrismaService) {} + + @Query(() => Campaign, { nullable: true }) + async getCampaignById(@Args('id') id: number): Promise { + // Validate ID format (assuming UUID format) + //TODO: difine other ways to validate the id. + if (typeof id !== 'number') { + throw new BadRequestException('Invalid campaign ID format'); + } + + // Fetch campaign from database + const campaign = await this.prismaService.campaign.findUnique({ + where: { id }, + }); + + // Handle non-existent campaign + if (!campaign) { + throw new NotFoundException(`Campaign with ID ${id} not found`); + } + + return campaign; + } }