diff --git a/README.md b/README.md
index 8f0f65f..74247e3 100644
--- a/README.md
+++ b/README.md
@@ -1,98 +1 @@
-
-
-
-
-[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
-[circleci-url]: https://circleci.com/gh/nestjs/nest
-
- A progressive Node.js framework for building efficient and scalable server-side applications.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Description
-
-[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
-
-## Project setup
-
-```bash
-$ npm install
-```
-
-## Compile and run the project
-
-```bash
-# development
-$ npm run start
-
-# watch mode
-$ npm run start:dev
-
-# production mode
-$ npm run start:prod
-```
-
-## Run tests
-
-```bash
-# unit tests
-$ npm run test
-
-# e2e tests
-$ npm run test:e2e
-
-# test coverage
-$ npm run test:cov
-```
-
-## Deployment
-
-When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information.
-
-If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps:
-
-```bash
-$ npm install -g @nestjs/mau
-$ mau deploy
-```
-
-With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure.
-
-## Resources
-
-Check out a few resources that may come in handy when working with NestJS:
-
-- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework.
-- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy).
-- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/).
-- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks.
-- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com).
-- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com).
-- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs).
-- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com).
-
-## Support
-
-Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
-
-## Stay in touch
-
-- Author - [Kamil MyĆliwiec](https://twitter.com/kammysliwiec)
-- Website - [https://nestjs.com](https://nestjs.com/)
-- Twitter - [@nestframework](https://twitter.com/nestframework)
-
-## License
-
-Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE).
+draw io:https://drive.google.com/file/d/1GG3wKqa1zMOOmao6KpTBBhl0Ykcl00Iv/view?usp=sharing
diff --git a/apps/bridage/src/bridage.controller.spec.ts b/apps/bridage/src/bridage.controller.spec.ts
new file mode 100644
index 0000000..4e4f622
--- /dev/null
+++ b/apps/bridage/src/bridage.controller.spec.ts
@@ -0,0 +1,22 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { BridageController } from './bridage.controller';
+import { BridageService } from './bridage.service';
+
+describe('BridageController', () => {
+ let bridageController: BridageController;
+
+ beforeEach(async () => {
+ const app: TestingModule = await Test.createTestingModule({
+ controllers: [BridageController],
+ providers: [BridageService],
+ }).compile();
+
+ bridageController = app.get(BridageController);
+ });
+
+ describe('root', () => {
+ it('should return "Hello World!"', () => {
+ expect(bridageController.getHello()).toBe('Hello World!');
+ });
+ });
+});
diff --git a/apps/bridage/src/bridage.controller.ts b/apps/bridage/src/bridage.controller.ts
new file mode 100644
index 0000000..f224803
--- /dev/null
+++ b/apps/bridage/src/bridage.controller.ts
@@ -0,0 +1,12 @@
+import { Controller, Get } from '@nestjs/common';
+import { BridageService } from './bridage.service';
+
+@Controller()
+export class BridageController {
+ constructor(private readonly bridageService: BridageService) {}
+
+ @Get()
+ getHello(): string {
+ return this.bridageService.getHello();
+ }
+}
diff --git a/apps/bridage/src/bridage.module.ts b/apps/bridage/src/bridage.module.ts
new file mode 100644
index 0000000..e621c26
--- /dev/null
+++ b/apps/bridage/src/bridage.module.ts
@@ -0,0 +1,10 @@
+import { Module } from '@nestjs/common';
+import { BridageController } from './bridage.controller';
+import { BridageService } from './bridage.service';
+
+@Module({
+ imports: [],
+ controllers: [BridageController],
+ providers: [BridageService],
+})
+export class BridageModule {}
diff --git a/src/app.service.ts b/apps/bridage/src/bridage.service.ts
similarity index 79%
rename from src/app.service.ts
rename to apps/bridage/src/bridage.service.ts
index 927d7cc..a1f2ea2 100644
--- a/src/app.service.ts
+++ b/apps/bridage/src/bridage.service.ts
@@ -1,7 +1,7 @@
import { Injectable } from '@nestjs/common';
@Injectable()
-export class AppService {
+export class BridageService {
getHello(): string {
return 'Hello World!';
}
diff --git a/apps/bridage/src/bridage/bridage.controller.spec.ts b/apps/bridage/src/bridage/bridage.controller.spec.ts
new file mode 100644
index 0000000..bf9ef08
--- /dev/null
+++ b/apps/bridage/src/bridage/bridage.controller.spec.ts
@@ -0,0 +1,20 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { BridageController } from './bridage.controller';
+import { BridageService } from './bridage.service';
+
+describe('BridageController', () => {
+ let controller: BridageController;
+
+ beforeEach(async () => {
+ const module: TestingModule = await Test.createTestingModule({
+ controllers: [BridageController],
+ providers: [BridageService],
+ }).compile();
+
+ controller = module.get(BridageController);
+ });
+
+ it('should be defined', () => {
+ expect(controller).toBeDefined();
+ });
+});
diff --git a/apps/bridage/src/bridage/bridage.controller.ts b/apps/bridage/src/bridage/bridage.controller.ts
new file mode 100644
index 0000000..92a1d76
--- /dev/null
+++ b/apps/bridage/src/bridage/bridage.controller.ts
@@ -0,0 +1,7 @@
+import { Controller } from '@nestjs/common';
+import { BridageService } from './bridage.service';
+
+@Controller('bridage')
+export class BridageController {
+ constructor(private readonly bridageService: BridageService) {}
+}
diff --git a/apps/bridage/src/bridage/bridage.module.ts b/apps/bridage/src/bridage/bridage.module.ts
new file mode 100644
index 0000000..3838391
--- /dev/null
+++ b/apps/bridage/src/bridage/bridage.module.ts
@@ -0,0 +1,9 @@
+import { Module } from '@nestjs/common';
+import { BridageService } from './bridage.service';
+import { BridageController } from './bridage.controller';
+
+@Module({
+ controllers: [BridageController],
+ providers: [BridageService],
+})
+export class BridageModule {}
diff --git a/apps/bridage/src/bridage/bridage.service.spec.ts b/apps/bridage/src/bridage/bridage.service.spec.ts
new file mode 100644
index 0000000..6eae1eb
--- /dev/null
+++ b/apps/bridage/src/bridage/bridage.service.spec.ts
@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { BridageService } from './bridage.service';
+
+describe('BridageService', () => {
+ let service: BridageService;
+
+ beforeEach(async () => {
+ const module: TestingModule = await Test.createTestingModule({
+ providers: [BridageService],
+ }).compile();
+
+ service = module.get(BridageService);
+ });
+
+ it('should be defined', () => {
+ expect(service).toBeDefined();
+ });
+});
diff --git a/apps/bridage/src/bridage/bridage.service.ts b/apps/bridage/src/bridage/bridage.service.ts
new file mode 100644
index 0000000..4bc03cc
--- /dev/null
+++ b/apps/bridage/src/bridage/bridage.service.ts
@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class BridageService {}
diff --git a/apps/bridage/src/bridage/entity/bridage.entity.ts b/apps/bridage/src/bridage/entity/bridage.entity.ts
new file mode 100644
index 0000000..3c3e70f
--- /dev/null
+++ b/apps/bridage/src/bridage/entity/bridage.entity.ts
@@ -0,0 +1,13 @@
+import { User } from "apps/users/src/user/entity/user.entity";
+import { Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm";
+
+
+
+@Entity()
+export class Bridage {
+ @PrimaryGeneratedColumn()
+ id: number;
+ @OneToOne(() => User, user => user.bridage)
+ user: User;
+}
+
diff --git a/src/database/config/configuration.ts b/apps/bridage/src/database/config/configuration.ts
similarity index 100%
rename from src/database/config/configuration.ts
rename to apps/bridage/src/database/config/configuration.ts
diff --git a/src/database/database.mdoule.ts b/apps/bridage/src/database/database.mdoule.ts
similarity index 100%
rename from src/database/database.mdoule.ts
rename to apps/bridage/src/database/database.mdoule.ts
diff --git a/src/database/database.providers.ts b/apps/bridage/src/database/database.providers.ts
similarity index 60%
rename from src/database/database.providers.ts
rename to apps/bridage/src/database/database.providers.ts
index 254b913..52a85bc 100644
--- a/src/database/database.providers.ts
+++ b/apps/bridage/src/database/database.providers.ts
@@ -1,5 +1,8 @@
import { DataSource } from 'typeorm';
import configuration from './config/configuration';
+import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity';
+import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity';
+import { User } from 'apps/users/src/user/entity/user.entity';
const config = configuration();
export const databaseProviders = [
{
@@ -9,7 +12,7 @@ export const databaseProviders = [
type: 'mongodb',
url: config.db_url,
database: 'test',
- entities: [],
+ entities: [User, Bridage, DailyWorkouts],
synchronize: true,
});
diff --git a/apps/bridage/src/main.ts b/apps/bridage/src/main.ts
new file mode 100644
index 0000000..87917aa
--- /dev/null
+++ b/apps/bridage/src/main.ts
@@ -0,0 +1,8 @@
+import { NestFactory } from '@nestjs/core';
+import { BridageModule } from './bridage.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create(BridageModule);
+ await app.listen(process.env.port ?? 3000);
+}
+bootstrap();
diff --git a/test/app.e2e-spec.ts b/apps/bridage/test/app.e2e-spec.ts
similarity index 71%
rename from test/app.e2e-spec.ts
rename to apps/bridage/test/app.e2e-spec.ts
index 4df6580..b42968c 100644
--- a/test/app.e2e-spec.ts
+++ b/apps/bridage/test/app.e2e-spec.ts
@@ -1,15 +1,14 @@
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
-import { App } from 'supertest/types';
-import { AppModule } from './../src/app.module';
+import { BridageModule } from './../src/bridage.module';
-describe('AppController (e2e)', () => {
- let app: INestApplication;
+describe('BridageController (e2e)', () => {
+ let app: INestApplication;
beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
- imports: [AppModule],
+ imports: [BridageModule],
}).compile();
app = moduleFixture.createNestApplication();
diff --git a/test/jest-e2e.json b/apps/bridage/test/jest-e2e.json
similarity index 100%
rename from test/jest-e2e.json
rename to apps/bridage/test/jest-e2e.json
diff --git a/apps/bridage/tsconfig.app.json b/apps/bridage/tsconfig.app.json
new file mode 100644
index 0000000..ae8ae17
--- /dev/null
+++ b/apps/bridage/tsconfig.app.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": false,
+ "outDir": "../../dist/apps/bridage"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts b/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts
new file mode 100644
index 0000000..39d5895
--- /dev/null
+++ b/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts
@@ -0,0 +1,9 @@
+import { Module } from '@nestjs/common';
+import { UserModule } from './user/user.module';
+
+@Module({
+ imports: [UserModule],
+ controllers: [],
+ providers: [],
+})
+export class HackathonApiGatewayModule { }
diff --git a/apps/hackathon-api-gateway/src/main.ts b/apps/hackathon-api-gateway/src/main.ts
new file mode 100644
index 0000000..c194de2
--- /dev/null
+++ b/apps/hackathon-api-gateway/src/main.ts
@@ -0,0 +1,8 @@
+import { NestFactory } from '@nestjs/core';
+import { HackathonApiGatewayModule } from './hackathon-api-gateway.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create(HackathonApiGatewayModule);
+ await app.listen(process.env.port ?? 3000);
+}
+bootstrap();
diff --git a/apps/hackathon-api-gateway/src/user/user.controller.ts b/apps/hackathon-api-gateway/src/user/user.controller.ts
new file mode 100644
index 0000000..df18db4
--- /dev/null
+++ b/apps/hackathon-api-gateway/src/user/user.controller.ts
@@ -0,0 +1,11 @@
+import { Controller, Get } from '@nestjs/common';
+import { UserService } from './user.service';
+
+@Controller('user')
+export class UserController {
+ constructor(private readonly userService: UserService) { }
+ @Get("findAll")
+ findAll() {
+ return this.userService.findAll()
+ }
+}
diff --git a/apps/hackathon-api-gateway/src/user/user.module.ts b/apps/hackathon-api-gateway/src/user/user.module.ts
new file mode 100644
index 0000000..9dc0d49
--- /dev/null
+++ b/apps/hackathon-api-gateway/src/user/user.module.ts
@@ -0,0 +1,26 @@
+import { Module } from '@nestjs/common';
+import { UserService } from './user.service';
+import { UserController } from './user.controller';
+import { ClientsModule, Transport } from '@nestjs/microservices';
+
+
+@Module({
+ imports: [
+ ClientsModule.register([
+ {
+ name: 'USER_SERVICE',
+ transport: Transport.RMQ,
+ options: {
+ urls: ['amqp://localhost:5672'],
+ queue: 'user_queue',
+ queueOptions: {
+ durable: false
+ },
+ },
+ },
+ ]),
+ ],
+ controllers: [UserController],
+ providers: [UserService],
+})
+export class UserModule { }
diff --git a/apps/hackathon-api-gateway/src/user/user.service.ts b/apps/hackathon-api-gateway/src/user/user.service.ts
new file mode 100644
index 0000000..f65becb
--- /dev/null
+++ b/apps/hackathon-api-gateway/src/user/user.service.ts
@@ -0,0 +1,14 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { ClientProxy } from '@nestjs/microservices';
+
+@Injectable()
+export class UserService {
+ constructor(@Inject("USER_SERVICE") private usersClient: ClientProxy) { }
+ async findAll() {
+ console.log("aa")
+ return this.usersClient.send("user.findAll", {})
+
+ }
+
+
+}
diff --git a/apps/hackathon-api-gateway/test/app.e2e-spec.ts b/apps/hackathon-api-gateway/test/app.e2e-spec.ts
new file mode 100644
index 0000000..e8a8dfd
--- /dev/null
+++ b/apps/hackathon-api-gateway/test/app.e2e-spec.ts
@@ -0,0 +1,24 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import * as request from 'supertest';
+import { HackathonApiGatewayModule } from './../src/hackathon-api-gateway.module';
+
+describe('HackathonApiGatewayController (e2e)', () => {
+ let app: INestApplication;
+
+ beforeEach(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [HackathonApiGatewayModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication();
+ await app.init();
+ });
+
+ it('/ (GET)', () => {
+ return request(app.getHttpServer())
+ .get('/')
+ .expect(200)
+ .expect('Hello World!');
+ });
+});
diff --git a/apps/hackathon-api-gateway/test/jest-e2e.json b/apps/hackathon-api-gateway/test/jest-e2e.json
new file mode 100644
index 0000000..e9d912f
--- /dev/null
+++ b/apps/hackathon-api-gateway/test/jest-e2e.json
@@ -0,0 +1,9 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": ".",
+ "testEnvironment": "node",
+ "testRegex": ".e2e-spec.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ }
+}
diff --git a/apps/hackathon-api-gateway/tsconfig.app.json b/apps/hackathon-api-gateway/tsconfig.app.json
new file mode 100644
index 0000000..103476c
--- /dev/null
+++ b/apps/hackathon-api-gateway/tsconfig.app.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": false,
+ "outDir": "../../dist/apps/hackathon-api-gateway"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/apps/users/constants.ts b/apps/users/constants.ts
new file mode 100644
index 0000000..7ba0d3f
--- /dev/null
+++ b/apps/users/constants.ts
@@ -0,0 +1,4 @@
+export const jwtConstants = {
+ secret: 'DO NOT USE THIS VALUE. INSTEAD, CREATE A COMPLEX SECRET AND KEEP IT SAFE OUTSIDE OF THE SOURCE CODE.',
+};
+
diff --git a/apps/users/src/main.ts b/apps/users/src/main.ts
new file mode 100644
index 0000000..cd73cba
--- /dev/null
+++ b/apps/users/src/main.ts
@@ -0,0 +1,18 @@
+import { NestFactory } from '@nestjs/core';
+import { UsersModule } from './users.module';
+import { MicroserviceOptions, Transport } from '@nestjs/microservices';
+
+async function bootstrap() {
+ const app = await NestFactory.createMicroservice(UsersModule, {
+ transport: Transport.RMQ,
+ options: {
+ urls: ['amqp://localhost:5672'],
+ queue: 'user_queue',
+ queueOptions: {
+ durable: false
+ },
+ },
+ });
+ await app.listen();
+}
+bootstrap();
diff --git a/apps/users/src/user/entity/user.entity.ts b/apps/users/src/user/entity/user.entity.ts
new file mode 100644
index 0000000..3f7543c
--- /dev/null
+++ b/apps/users/src/user/entity/user.entity.ts
@@ -0,0 +1,19 @@
+import { Bridage } from "apps/bridage/src/bridage/entity/bridage.entity";
+import { DailyWorkouts } from "apps/workouts/src/daily-workouts/entity/daily-workouts.entity";
+import { Column, Entity, ManyToOne, OneToMany, OneToOne, PrimaryGeneratedColumn } from "typeorm";
+
+@Entity()
+export class User {
+ @PrimaryGeneratedColumn()
+ id: number;
+ @Column()
+ email: string;
+ @Column()
+ name: string
+ @Column()
+ password: string
+ @OneToOne(() => Bridage, bridage => bridage.user)
+ bridage: Bridage;
+ @OneToMany(() => DailyWorkouts, workout => workout.id)
+ dailyWorkout: DailyWorkouts[];
+}
diff --git a/apps/users/src/user/user.controller.ts b/apps/users/src/user/user.controller.ts
new file mode 100644
index 0000000..8f6bf4a
--- /dev/null
+++ b/apps/users/src/user/user.controller.ts
@@ -0,0 +1,12 @@
+import { Controller } from '@nestjs/common';
+import { UserService } from './user.service';
+import { MessagePattern } from '@nestjs/microservices';
+
+export class UserController {
+ constructor(private readonly userService: UserService) { }
+ @MessagePattern('user.findAll')
+ findAll() {
+ console.log(`Pattern: `);
+ return "user find"
+ }
+}
diff --git a/apps/users/src/user/user.module.ts b/apps/users/src/user/user.module.ts
new file mode 100644
index 0000000..1ec4416
--- /dev/null
+++ b/apps/users/src/user/user.module.ts
@@ -0,0 +1,15 @@
+import { forwardRef, Module } from '@nestjs/common';
+import { UserService } from './user.service';
+import { UserController } from './user.controller';
+import { User } from './entity/user.entity';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { userProviders } from './user.providers';
+import { DatabaseModule } from '@libs/database/src';
+@Module({
+ imports: [DatabaseModule],
+ controllers: [UserController],
+ providers: [...userProviders, UserService],
+ exports: [UserService],
+
+})
+export class UserModule { }
diff --git a/apps/users/src/user/user.providers.ts b/apps/users/src/user/user.providers.ts
new file mode 100644
index 0000000..244d64e
--- /dev/null
+++ b/apps/users/src/user/user.providers.ts
@@ -0,0 +1,11 @@
+import { DataSource } from 'typeorm';
+import { User } from './entity/user.entity';
+
+export const userProviders = [
+ {
+ provide: 'USER_REPOSITORY',
+ useFactory: (dataSource: DataSource) => dataSource.getRepository(User),
+ inject: ['DATA_SOURCE'],
+ },
+];
+
diff --git a/apps/users/src/user/user.service.ts b/apps/users/src/user/user.service.ts
new file mode 100644
index 0000000..ed20fea
--- /dev/null
+++ b/apps/users/src/user/user.service.ts
@@ -0,0 +1,19 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { User } from './entity/user.entity';
+import { Repository } from 'typeorm';
+
+@Injectable()
+export class UserService {
+ constructor(
+ @Inject('USER_REPOSITORY')
+ private readonly userRepository: Repository,
+ ) { }
+
+ async findOne(email: string): Promise {
+ return this.userRepository.findOne({
+ where: { email },
+ relations: ['bridage', 'dailyWorkout'],
+ });
+ }
+}
diff --git a/apps/users/src/users.module.ts b/apps/users/src/users.module.ts
new file mode 100644
index 0000000..d3cd9ac
--- /dev/null
+++ b/apps/users/src/users.module.ts
@@ -0,0 +1,10 @@
+import { Module } from '@nestjs/common';
+import { UserModule } from './user/user.module';
+import { DatabaseModule } from 'apps/workouts/src/database/database.mdoule';
+
+@Module({
+ imports: [UserModule, DatabaseModule],
+ controllers: [],
+ providers: [],
+})
+export class UsersModule { }
diff --git a/apps/users/test/app.e2e-spec.ts b/apps/users/test/app.e2e-spec.ts
new file mode 100644
index 0000000..af08da0
--- /dev/null
+++ b/apps/users/test/app.e2e-spec.ts
@@ -0,0 +1,24 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import * as request from 'supertest';
+import { UsersModule } from './../src/users.module';
+
+describe('UsersController (e2e)', () => {
+ let app: INestApplication;
+
+ beforeEach(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [UsersModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication();
+ await app.init();
+ });
+
+ it('/ (GET)', () => {
+ return request(app.getHttpServer())
+ .get('/')
+ .expect(200)
+ .expect('Hello World!');
+ });
+});
diff --git a/apps/users/test/jest-e2e.json b/apps/users/test/jest-e2e.json
new file mode 100644
index 0000000..e9d912f
--- /dev/null
+++ b/apps/users/test/jest-e2e.json
@@ -0,0 +1,9 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": ".",
+ "testEnvironment": "node",
+ "testRegex": ".e2e-spec.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ }
+}
diff --git a/apps/users/tsconfig.app.json b/apps/users/tsconfig.app.json
new file mode 100644
index 0000000..7c55507
--- /dev/null
+++ b/apps/users/tsconfig.app.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": false,
+ "outDir": "../../dist/apps/users"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts b/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts
new file mode 100644
index 0000000..bd59ed4
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts
@@ -0,0 +1,20 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { DailyWorkoutsController } from './daily-workouts.controller';
+import { DailyWorkoutsService } from './daily-workouts.service';
+
+describe('DailyWorkoutsController', () => {
+ let controller: DailyWorkoutsController;
+
+ beforeEach(async () => {
+ const module: TestingModule = await Test.createTestingModule({
+ controllers: [DailyWorkoutsController],
+ providers: [DailyWorkoutsService],
+ }).compile();
+
+ controller = module.get(DailyWorkoutsController);
+ });
+
+ it('should be defined', () => {
+ expect(controller).toBeDefined();
+ });
+});
diff --git a/apps/workouts/src/daily-workouts/daily-workouts.controller.ts b/apps/workouts/src/daily-workouts/daily-workouts.controller.ts
new file mode 100644
index 0000000..76eab68
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/daily-workouts.controller.ts
@@ -0,0 +1,7 @@
+import { Controller } from '@nestjs/common';
+import { DailyWorkoutsService } from './daily-workouts.service';
+
+@Controller('daily-workouts')
+export class DailyWorkoutsController {
+ constructor(private readonly dailyWorkoutsService: DailyWorkoutsService) {}
+}
diff --git a/apps/workouts/src/daily-workouts/daily-workouts.module.ts b/apps/workouts/src/daily-workouts/daily-workouts.module.ts
new file mode 100644
index 0000000..4059c9c
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/daily-workouts.module.ts
@@ -0,0 +1,9 @@
+import { Module } from '@nestjs/common';
+import { DailyWorkoutsService } from './daily-workouts.service';
+import { DailyWorkoutsController } from './daily-workouts.controller';
+
+@Module({
+ controllers: [DailyWorkoutsController],
+ providers: [DailyWorkoutsService],
+})
+export class DailyWorkoutsModule {}
diff --git a/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts b/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts
new file mode 100644
index 0000000..7609227
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts
@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { DailyWorkoutsService } from './daily-workouts.service';
+
+describe('DailyWorkoutsService', () => {
+ let service: DailyWorkoutsService;
+
+ beforeEach(async () => {
+ const module: TestingModule = await Test.createTestingModule({
+ providers: [DailyWorkoutsService],
+ }).compile();
+
+ service = module.get(DailyWorkoutsService);
+ });
+
+ it('should be defined', () => {
+ expect(service).toBeDefined();
+ });
+});
diff --git a/apps/workouts/src/daily-workouts/daily-workouts.service.ts b/apps/workouts/src/daily-workouts/daily-workouts.service.ts
new file mode 100644
index 0000000..c092aff
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/daily-workouts.service.ts
@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class DailyWorkoutsService {}
diff --git a/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts b/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts
new file mode 100644
index 0000000..c2d7633
--- /dev/null
+++ b/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts
@@ -0,0 +1,10 @@
+import { User } from "apps/users/src/user/entity/user.entity";
+import { Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
+
+@Entity()
+export class DailyWorkouts {
+ @PrimaryGeneratedColumn()
+ id: number;
+ @ManyToOne(() => User, user => user.id)
+ user: User
+}
diff --git a/apps/workouts/src/database/config/configuration.ts b/apps/workouts/src/database/config/configuration.ts
new file mode 100644
index 0000000..a8a81e6
--- /dev/null
+++ b/apps/workouts/src/database/config/configuration.ts
@@ -0,0 +1,5 @@
+
+export default () => ({
+ db_url: process.env.DATABASE_URL,
+});
+
diff --git a/apps/workouts/src/database/database.mdoule.ts b/apps/workouts/src/database/database.mdoule.ts
new file mode 100644
index 0000000..537a73d
--- /dev/null
+++ b/apps/workouts/src/database/database.mdoule.ts
@@ -0,0 +1,15 @@
+import { Module } from '@nestjs/common';
+import { databaseProviders } from './database.providers';
+import { ConfigModule } from '@nestjs/config';
+import configuration from './config/configuration';
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({
+ load: [configuration],
+ }),
+ ],
+ providers: [...databaseProviders],
+ exports: [...databaseProviders],
+})
+export class DatabaseModule { }
diff --git a/apps/workouts/src/database/database.providers.ts b/apps/workouts/src/database/database.providers.ts
new file mode 100644
index 0000000..66a870f
--- /dev/null
+++ b/apps/workouts/src/database/database.providers.ts
@@ -0,0 +1,24 @@
+import { DataSource } from 'typeorm';
+import configuration from './config/configuration';
+import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity';
+import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity';
+import { User } from 'apps/users/src/user/entity/user.entity';
+
+const config = configuration();
+export const databaseProviders = [
+ {
+ provide: 'DATA_SOURCE',
+ useFactory: async () => {
+ const dataSource = new DataSource({
+ type: 'mongodb',
+ url: config.db_url,
+ database: 'test',
+ entities: [User, Bridage, DailyWorkouts],
+ synchronize: true,
+ });
+
+ return dataSource.initialize();
+ },
+ },
+];
+
diff --git a/apps/workouts/src/main.ts b/apps/workouts/src/main.ts
new file mode 100644
index 0000000..a7c8b64
--- /dev/null
+++ b/apps/workouts/src/main.ts
@@ -0,0 +1,8 @@
+import { NestFactory } from '@nestjs/core';
+import { WorkoutsModule } from './workouts.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create(WorkoutsModule);
+ await app.listen(process.env.port ?? 3000);
+}
+bootstrap();
diff --git a/apps/workouts/src/workouts.controller.spec.ts b/apps/workouts/src/workouts.controller.spec.ts
new file mode 100644
index 0000000..9d8e72e
--- /dev/null
+++ b/apps/workouts/src/workouts.controller.spec.ts
@@ -0,0 +1,22 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { WorkoutsController } from './workouts.controller';
+import { WorkoutsService } from './workouts.service';
+
+describe('WorkoutsController', () => {
+ let workoutsController: WorkoutsController;
+
+ beforeEach(async () => {
+ const app: TestingModule = await Test.createTestingModule({
+ controllers: [WorkoutsController],
+ providers: [WorkoutsService],
+ }).compile();
+
+ workoutsController = app.get(WorkoutsController);
+ });
+
+ describe('root', () => {
+ it('should return "Hello World!"', () => {
+ expect(workoutsController.getHello()).toBe('Hello World!');
+ });
+ });
+});
diff --git a/apps/workouts/src/workouts.controller.ts b/apps/workouts/src/workouts.controller.ts
new file mode 100644
index 0000000..c7e2e17
--- /dev/null
+++ b/apps/workouts/src/workouts.controller.ts
@@ -0,0 +1,12 @@
+import { Controller, Get } from '@nestjs/common';
+import { WorkoutsService } from './workouts.service';
+
+@Controller()
+export class WorkoutsController {
+ constructor(private readonly workoutsService: WorkoutsService) {}
+
+ @Get()
+ getHello(): string {
+ return this.workoutsService.getHello();
+ }
+}
diff --git a/apps/workouts/src/workouts.module.ts b/apps/workouts/src/workouts.module.ts
new file mode 100644
index 0000000..2023662
--- /dev/null
+++ b/apps/workouts/src/workouts.module.ts
@@ -0,0 +1,10 @@
+import { Module } from '@nestjs/common';
+import { WorkoutsController } from './workouts.controller';
+import { WorkoutsService } from './workouts.service';
+
+@Module({
+ imports: [],
+ controllers: [WorkoutsController],
+ providers: [WorkoutsService],
+})
+export class WorkoutsModule {}
diff --git a/apps/workouts/src/workouts.service.ts b/apps/workouts/src/workouts.service.ts
new file mode 100644
index 0000000..58b4b10
--- /dev/null
+++ b/apps/workouts/src/workouts.service.ts
@@ -0,0 +1,8 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class WorkoutsService {
+ getHello(): string {
+ return 'Hello World!';
+ }
+}
diff --git a/apps/workouts/test/app.e2e-spec.ts b/apps/workouts/test/app.e2e-spec.ts
new file mode 100644
index 0000000..27f3a98
--- /dev/null
+++ b/apps/workouts/test/app.e2e-spec.ts
@@ -0,0 +1,24 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import * as request from 'supertest';
+import { WorkoutsModule } from './../src/workouts.module';
+
+describe('WorkoutsController (e2e)', () => {
+ let app: INestApplication;
+
+ beforeEach(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [WorkoutsModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication();
+ await app.init();
+ });
+
+ it('/ (GET)', () => {
+ return request(app.getHttpServer())
+ .get('/')
+ .expect(200)
+ .expect('Hello World!');
+ });
+});
diff --git a/apps/workouts/test/jest-e2e.json b/apps/workouts/test/jest-e2e.json
new file mode 100644
index 0000000..e9d912f
--- /dev/null
+++ b/apps/workouts/test/jest-e2e.json
@@ -0,0 +1,9 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": ".",
+ "testEnvironment": "node",
+ "testRegex": ".e2e-spec.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ }
+}
diff --git a/apps/workouts/tsconfig.app.json b/apps/workouts/tsconfig.app.json
new file mode 100644
index 0000000..90ee94a
--- /dev/null
+++ b/apps/workouts/tsconfig.app.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": false,
+ "outDir": "../../dist/apps/workouts"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/libs/contracts/tsconfig.lib.json b/libs/contracts/tsconfig.lib.json
new file mode 100644
index 0000000..f0b647f
--- /dev/null
+++ b/libs/contracts/tsconfig.lib.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": true,
+ "outDir": "../../dist/libs/contracts"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/libs/contracts/users/validateUser.dto.ts b/libs/contracts/users/validateUser.dto.ts
new file mode 100644
index 0000000..62e6467
--- /dev/null
+++ b/libs/contracts/users/validateUser.dto.ts
@@ -0,0 +1,10 @@
+import { IsString } from "class-validator";
+
+
+export class ValidateUserDto {
+ @IsString()
+ email: string
+ @IsString()
+ password: string
+
+}
diff --git a/libs/database/src/config/configuration.ts b/libs/database/src/config/configuration.ts
new file mode 100644
index 0000000..9180c97
--- /dev/null
+++ b/libs/database/src/config/configuration.ts
@@ -0,0 +1,7 @@
+require('dotenv').config();
+
+export default () => ({
+ db_url: process.env.DATABASE_URL,
+});
+
+
diff --git a/libs/database/src/database.module.ts b/libs/database/src/database.module.ts
new file mode 100644
index 0000000..f5cb774
--- /dev/null
+++ b/libs/database/src/database.module.ts
@@ -0,0 +1,23 @@
+import { Module } from '@nestjs/common';
+import { databaseProviders } from './database.providers';
+import { ConfigModule } from '@nestjs/config';
+import configuration from './config/configuration';
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({
+ load: [configuration],
+ }),
+ ],
+ providers: [...databaseProviders],
+ exports: [...databaseProviders],
+})
+export class DatabaseModule { }
+
+
+
+
+
+
+
+
diff --git a/libs/database/src/database.providers.ts b/libs/database/src/database.providers.ts
new file mode 100644
index 0000000..9608160
--- /dev/null
+++ b/libs/database/src/database.providers.ts
@@ -0,0 +1,23 @@
+import { DataSource } from 'typeorm';
+import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity';
+import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity';
+import { User } from 'apps/users/src/user/entity/user.entity';
+import configuration from './config/configuration';
+const config = configuration();
+export const databaseProviders = [
+ {
+ provide: 'DATA_SOURCE',
+ useFactory: async () => {
+ const dataSource = new DataSource({
+ type: 'mongodb',
+ url: config.db_url,
+ database: 'test',
+ entities: [User, Bridage, DailyWorkouts],
+ synchronize: true,
+ });
+
+ return dataSource.initialize();
+ },
+ },
+];
+
diff --git a/libs/database/src/index.ts b/libs/database/src/index.ts
new file mode 100644
index 0000000..10befac
--- /dev/null
+++ b/libs/database/src/index.ts
@@ -0,0 +1,2 @@
+export * from './database.module';
+export * from './database.providers';
diff --git a/libs/database/tsconfig.lib.json b/libs/database/tsconfig.lib.json
new file mode 100644
index 0000000..21c8d58
--- /dev/null
+++ b/libs/database/tsconfig.lib.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": true,
+ "outDir": "../../dist/libs/database"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/libs/guards/src/auth.guard.ts b/libs/guards/src/auth.guard.ts
new file mode 100644
index 0000000..e69de29
diff --git a/libs/guards/src/guards.module.ts b/libs/guards/src/guards.module.ts
new file mode 100644
index 0000000..465e3a1
--- /dev/null
+++ b/libs/guards/src/guards.module.ts
@@ -0,0 +1,9 @@
+import { Module } from '@nestjs/common';
+import { LocalAuthGuard } from './local-auth.guard';
+import { JwtAuthGuard } from './auth.guard';
+
+@Module({
+ providers: [LocalAuthGuard, JwtAuthGuard],
+ exports: [LocalAuthGuard, JwtAuthGuard],
+})
+export class GuardsModule { }
diff --git a/libs/guards/src/index.ts b/libs/guards/src/index.ts
new file mode 100644
index 0000000..fb483c5
--- /dev/null
+++ b/libs/guards/src/index.ts
@@ -0,0 +1,2 @@
+export * from './guards.module';
+export * from './guards.service';
diff --git a/libs/guards/src/local-auth.guard.ts b/libs/guards/src/local-auth.guard.ts
new file mode 100644
index 0000000..250817d
--- /dev/null
+++ b/libs/guards/src/local-auth.guard.ts
@@ -0,0 +1,6 @@
+import { Injectable } from '@nestjs/common';
+import { AuthGuard } from '@nestjs/passport';
+
+@Injectable()
+export class LocalAuthGuard extends AuthGuard('local') { }
+
diff --git a/libs/guards/tsconfig.lib.json b/libs/guards/tsconfig.lib.json
new file mode 100644
index 0000000..d0a3e3d
--- /dev/null
+++ b/libs/guards/tsconfig.lib.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": true,
+ "outDir": "../../dist/libs/guards"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/libs/strategy/src/auth.strategy.ts b/libs/strategy/src/auth.strategy.ts
new file mode 100644
index 0000000..6523d77
--- /dev/null
+++ b/libs/strategy/src/auth.strategy.ts
@@ -0,0 +1,31 @@
+import { ExtractJwt, Strategy } from 'passport-jwt';
+import { PassportStrategy } from '@nestjs/passport';
+import { Injectable, UnauthorizedException } from '@nestjs/common';
+import { Request } from 'express';
+import { jwtConstants } from 'apps/users/constants';
+
+@Injectable()
+export class JwtStrategy extends PassportStrategy(Strategy) {
+ constructor() {
+ super({
+ jwtFromRequest: ExtractJwt.fromExtractors([
+ (req: Request) => {
+ if (req && req.cookies) {
+ return req.cookies['token'];
+ }
+ return null;
+ },
+ ]),
+ ignoreExpiration: false,
+ secretOrKey: jwtConstants.secret,
+ });
+ }
+
+ async validate(payload: any) {
+ if (!payload) {
+ throw new UnauthorizedException();
+ }
+ return { id: payload.id };
+ }
+}
+
diff --git a/libs/strategy/src/index.ts b/libs/strategy/src/index.ts
new file mode 100644
index 0000000..ca3ec7d
--- /dev/null
+++ b/libs/strategy/src/index.ts
@@ -0,0 +1 @@
+export * from './strategy.module';
diff --git a/libs/strategy/src/local.strategy.ts b/libs/strategy/src/local.strategy.ts
new file mode 100644
index 0000000..e599b30
--- /dev/null
+++ b/libs/strategy/src/local.strategy.ts
@@ -0,0 +1,17 @@
+import { PassportStrategy } from "@nestjs/passport";
+import { Strategy } from "passport-local";
+import { Inject, Injectable } from "@nestjs/common";
+import { ClientProxy } from "@nestjs/microservices";
+
+@Injectable()
+export class LocalStrategy extends PassportStrategy(Strategy) {
+ constructor(@Inject("USER_SERVICE") private usersClient: ClientProxy) {
+ super({ usernameField: 'email', passReqToCallback: false });
+ }
+
+ async validate(email: string, password: string): Promise {
+ const user = this.usersClient.send("auth.validateUser", { email, password })
+ return user;
+ }
+}
+
diff --git a/libs/strategy/src/strategy.module.ts b/libs/strategy/src/strategy.module.ts
new file mode 100644
index 0000000..395413a
--- /dev/null
+++ b/libs/strategy/src/strategy.module.ts
@@ -0,0 +1,33 @@
+import { Module } from '@nestjs/common';
+import { ClientsModule, Transport } from '@nestjs/microservices';
+import { LocalStrategy } from './local.strategy';
+import { JwtStrategy } from './auth.strategy';
+import { JwtModule } from '@nestjs/jwt';
+import { jwtConstants } from 'apps/users/constants';
+import { PassportModule } from '@nestjs/passport';
+
+@Module({
+ imports: [
+ ClientsModule.register([
+ {
+ name: 'USER_SERVICE',
+ transport: Transport.RMQ,
+ options: {
+ urls: ['amqp://localhost:5672'],
+ queue: 'user_queue',
+ queueOptions: {
+ durable: false
+ },
+ },
+ },
+ ]),
+ PassportModule.register({ session: false }),
+ JwtModule.register({
+ secret: jwtConstants.secret,
+ signOptions: { expiresIn: '1h' },
+ }),
+ ],
+ providers: [LocalStrategy, JwtStrategy],
+ exports: [LocalStrategy, JwtModule],
+})
+export class StrategyModule { }
diff --git a/libs/strategy/tsconfig.lib.json b/libs/strategy/tsconfig.lib.json
new file mode 100644
index 0000000..7348032
--- /dev/null
+++ b/libs/strategy/tsconfig.lib.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "declaration": true,
+ "outDir": "../../dist/libs/strategy"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/nest-cli.json b/nest-cli.json
index f9aa683..077cf39 100644
--- a/nest-cli.json
+++ b/nest-cli.json
@@ -1,8 +1,86 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
- "sourceRoot": "src",
+ "sourceRoot": "apps/hackathon-api-gateway/src",
"compilerOptions": {
- "deleteOutDir": true
+ "deleteOutDir": true,
+ "webpack": true,
+ "tsConfigPath": "apps/hackathon-api-gateway/tsconfig.app.json"
+ },
+ "monorepo": true,
+ "root": "apps/hackathon-api-gateway",
+ "projects": {
+ "bridage": {
+ "type": "application",
+ "root": "apps/bridage",
+ "entryFile": "main",
+ "sourceRoot": "apps/bridage/src",
+ "compilerOptions": {
+ "tsConfigPath": "apps/bridage/tsconfig.app.json"
+ }
+ },
+ "contracts": {
+ "type": "library",
+ "root": "libs/contracts",
+ "entryFile": "index",
+ "sourceRoot": "libs/contracts/src",
+ "compilerOptions": {
+ "tsConfigPath": "libs/contracts/tsconfig.lib.json"
+ }
+ },
+ "database": {
+ "type": "library",
+ "root": "libs/database",
+ "entryFile": "index",
+ "sourceRoot": "libs/database/src",
+ "compilerOptions": {
+ "tsConfigPath": "libs/database/tsconfig.lib.json"
+ }
+ },
+ "guards": {
+ "type": "library",
+ "root": "libs/guards",
+ "entryFile": "index",
+ "sourceRoot": "libs/guards/src",
+ "compilerOptions": {
+ "tsConfigPath": "libs/guards/tsconfig.lib.json"
+ }
+ },
+ "hackathon-api-gateway": {
+ "type": "application",
+ "root": "apps/hackathon-api-gateway",
+ "entryFile": "main",
+ "sourceRoot": "apps/hackathon-api-gateway/src",
+ "compilerOptions": {
+ "tsConfigPath": "apps/hackathon-api-gateway/tsconfig.app.json"
+ }
+ },
+ "strategy": {
+ "type": "library",
+ "root": "libs/strategy",
+ "entryFile": "index",
+ "sourceRoot": "libs/strategy/src",
+ "compilerOptions": {
+ "tsConfigPath": "libs/strategy/tsconfig.lib.json"
+ }
+ },
+ "users": {
+ "type": "application",
+ "root": "apps/users",
+ "entryFile": "main",
+ "sourceRoot": "apps/users/src",
+ "compilerOptions": {
+ "tsConfigPath": "apps/users/tsconfig.app.json"
+ }
+ },
+ "workouts": {
+ "type": "application",
+ "root": "apps/workouts",
+ "entryFile": "main",
+ "sourceRoot": "apps/workouts/src",
+ "compilerOptions": {
+ "tsConfigPath": "apps/workouts/tsconfig.app.json"
+ }
+ }
}
-}
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 81270c8..f23bd80 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,9 +12,20 @@
"@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.0.1",
+ "@nestjs/jwt": "^11.0.0",
+ "@nestjs/mapped-types": "*",
+ "@nestjs/microservices": "^11.0.17",
+ "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.0.1",
"@nestjs/typeorm": "^11.0.0",
+ "amqp-connection-manager": "^4.1.14",
+ "amqplib": "^0.10.7",
+ "bcrypt": "^5.1.1",
+ "class-validator": "^0.14.1",
"mongodb": "^6.15.0",
+ "passport": "^0.7.0",
+ "passport-jwt": "^4.0.1",
+ "passport-local": "^1.0.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1",
"typeorm": "^0.3.22"
@@ -30,6 +41,8 @@
"@types/express": "^5.0.0",
"@types/jest": "^29.5.14",
"@types/node": "^22.10.7",
+ "@types/passport-jwt": "^4.0.1",
+ "@types/passport-local": "^1.0.38",
"@types/supertest": "^6.0.2",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
@@ -1923,6 +1936,50 @@
"node": ">=8"
}
},
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/@mongodb-js/saslprep": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz",
@@ -2564,6 +2621,107 @@
}
}
},
+ "node_modules/@nestjs/jwt": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz",
+ "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/jsonwebtoken": "9.0.7",
+ "jsonwebtoken": "9.0.2"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0"
+ }
+ },
+ "node_modules/@nestjs/mapped-types": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz",
+ "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
+ "class-transformer": "^0.4.0 || ^0.5.0",
+ "class-validator": "^0.13.0 || ^0.14.0",
+ "reflect-metadata": "^0.1.12 || ^0.2.0"
+ },
+ "peerDependenciesMeta": {
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/microservices": {
+ "version": "11.0.17",
+ "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.0.17.tgz",
+ "integrity": "sha512-eUPJR8BG+bvhl92GWx8uvNDY95HHidYefWG4pfXr4rbUK7HxQCGxnyeM458QFu3w66Ia1KqlQbKnfdhY8wu6pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "iterare": "1.2.1",
+ "tslib": "2.8.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@grpc/grpc-js": "*",
+ "@nestjs/common": "^11.0.0",
+ "@nestjs/core": "^11.0.0",
+ "@nestjs/websockets": "^11.0.0",
+ "amqp-connection-manager": "*",
+ "amqplib": "*",
+ "cache-manager": "*",
+ "ioredis": "*",
+ "kafkajs": "*",
+ "mqtt": "*",
+ "nats": "*",
+ "reflect-metadata": "^0.1.12 || ^0.2.0",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@grpc/grpc-js": {
+ "optional": true
+ },
+ "@nestjs/websockets": {
+ "optional": true
+ },
+ "amqp-connection-manager": {
+ "optional": true
+ },
+ "amqplib": {
+ "optional": true
+ },
+ "cache-manager": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "kafkajs": {
+ "optional": true
+ },
+ "mqtt": {
+ "optional": true
+ },
+ "nats": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/passport": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz",
+ "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
+ "passport": "^0.5.0 || ^0.6.0 || ^0.7.0"
+ }
+ },
"node_modules/@nestjs/platform-express": {
"version": "11.0.16",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.16.tgz",
@@ -3332,6 +3490,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/jsonwebtoken": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz",
+ "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/methods": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
@@ -3350,12 +3517,55 @@
"version": "22.14.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz",
"integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
+ "node_modules/@types/passport": {
+ "version": "1.0.17",
+ "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz",
+ "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/passport-jwt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz",
+ "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/jsonwebtoken": "*",
+ "@types/passport-strategy": "*"
+ }
+ },
+ "node_modules/@types/passport-local": {
+ "version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz",
+ "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*",
+ "@types/passport": "*",
+ "@types/passport-strategy": "*"
+ }
+ },
+ "node_modules/@types/passport-strategy": {
+ "version": "0.2.38",
+ "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz",
+ "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*",
+ "@types/passport": "*"
+ }
+ },
"node_modules/@types/qs": {
"version": "6.9.18",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
@@ -3424,6 +3634,12 @@
"@types/superagent": "^8.1.0"
}
},
+ "node_modules/@types/validator": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.0.tgz",
+ "integrity": "sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==",
+ "license": "MIT"
+ },
"node_modules/@types/webidl-conversions": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
@@ -4481,6 +4697,12 @@
"dev": true,
"license": "Apache-2.0"
},
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "license": "ISC"
+ },
"node_modules/accepts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -4530,6 +4752,18 @@
"node": ">=0.4.0"
}
},
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -4599,6 +4833,35 @@
"ajv": "^6.9.1"
}
},
+ "node_modules/amqp-connection-manager": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-4.1.14.tgz",
+ "integrity": "sha512-1km47dIvEr0HhMUazqovSvNwIlSvDX2APdUpULaINtHpiki1O+cLRaTeXb/jav4OLtH+k6GBXx5gsKOT9kcGKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "promise-breaker": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0",
+ "npm": ">5.0.0"
+ },
+ "peerDependencies": {
+ "amqplib": "*"
+ }
+ },
+ "node_modules/amqplib": {
+ "version": "0.10.7",
+ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.7.tgz",
+ "integrity": "sha512-7xPSYKSX2kj/bT6iHZ3MlctzxdCW1Ds9xyN0EmuRi2DZxHztwwoG1YkZrgmLyuPNjfxlRiMdWJPQscmoa3Vgdg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-more-ints": "~1.0.0",
+ "url-parse": "~1.5.10"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/ansi-colors": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
@@ -4703,6 +4966,12 @@
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
"license": "MIT"
},
+ "node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "license": "ISC"
+ },
"node_modules/arch": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/arch/-/arch-3.0.0.tgz",
@@ -4724,6 +4993,34 @@
],
"license": "MIT"
},
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/are-we-there-yet/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -4933,6 +5230,20 @@
],
"license": "MIT"
},
+ "node_modules/bcrypt": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
+ "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.11",
+ "node-addon-api": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/bin-version": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz",
@@ -5019,7 +5330,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -5139,12 +5449,24 @@
"node": "*"
}
},
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"license": "MIT"
},
+ "node_modules/buffer-more-ints": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
+ "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==",
+ "license": "MIT"
+ },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -5314,6 +5636,15 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
@@ -5347,6 +5678,17 @@
"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",
+ "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",
@@ -5497,6 +5839,15 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "license": "ISC",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -5551,7 +5902,6 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
"license": "MIT"
},
"node_modules/concat-stream": {
@@ -5578,6 +5928,12 @@
"node": "^14.18.0 || >=16.10.0"
}
},
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "license": "ISC"
+ },
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -5838,6 +6194,12 @@
"node": ">=0.4.0"
}
},
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -5847,6 +6209,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/detect-newline": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
@@ -5935,6 +6306,15 @@
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"license": "MIT"
},
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -6929,6 +7309,36 @@
"node": ">=12"
}
},
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
"node_modules/fs-monkey": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
@@ -6940,7 +7350,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
"license": "ISC"
},
"node_modules/fsevents": {
@@ -6967,6 +7376,54 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gauge/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/gauge/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/gauge/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -7229,6 +7686,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "license": "ISC"
+ },
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -7295,6 +7758,19 @@
"node": ">=10.19.0"
}
},
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -7399,7 +7875,6 @@
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
@@ -8450,6 +8925,49 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -8504,6 +9022,12 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/libphonenumber-js": {
+ "version": "1.12.6",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.6.tgz",
+ "integrity": "sha512-PJiS4ETaUfCOFLpmtKzAbqZQjCCKVu2OhTV4SVNNE7c2nu/dACvtCqj4L0i/KWNnIgRv7yrILvBj5Lonv5Ncxw==",
+ "license": "MIT"
+ },
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -8543,6 +9067,42 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "license": "MIT"
+ },
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -8557,6 +9117,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "license": "MIT"
+ },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -8804,7 +9370,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -8831,6 +9396,37 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -9006,6 +9602,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
+ "license": "MIT"
+ },
"node_modules/node-emoji": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
@@ -9016,6 +9618,48 @@
"lodash": "^4.17.21"
}
},
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -9030,6 +9674,21 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -9066,6 +9725,19 @@
"node": ">=8"
}
},
+ "node_modules/npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -9298,6 +9970,53 @@
"node": ">= 0.8"
}
},
+ "node_modules/passport": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
+ "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1",
+ "utils-merge": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-jwt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
+ "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jsonwebtoken": "^9.0.0",
+ "passport-strategy": "^1.0.0"
+ }
+ },
+ "node_modules/passport-local": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
+ "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
+ "dependencies": {
+ "passport-strategy": "1.x.x"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -9312,7 +10031,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -9380,6 +10098,11 @@
"node": ">=8"
}
},
+ "node_modules/pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
+ },
"node_modules/peek-readable": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz",
@@ -9593,6 +10316,12 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"license": "MIT"
},
+ "node_modules/promise-breaker": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-6.0.0.tgz",
+ "integrity": "sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==",
+ "license": "MIT"
+ },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -9661,6 +10390,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "license": "MIT"
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -9806,6 +10541,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -9925,6 +10666,43 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/router": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -10047,7 +10825,6 @@
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -10132,6 +10909,12 @@
"node": ">= 18"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC"
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -10736,6 +11519,23 @@
"node": ">=6"
}
},
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/tar-stream": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
@@ -10748,6 +11548,33 @@
"streamx": "^2.15.0"
}
},
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
"node_modules/terser": {
"version": "5.39.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
@@ -11580,7 +12407,6 @@
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "devOptional": true,
"license": "MIT"
},
"node_modules/universalify": {
@@ -11643,12 +12469,31 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/uuid": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
@@ -11684,6 +12529,15 @@
"node": ">=10.12.0"
}
},
+ "node_modules/validator": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz",
+ "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -11976,6 +12830,15 @@
"node": ">= 8"
}
},
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
diff --git a/package.json b/package.json
index 7a7af20..d263878 100644
--- a/package.json
+++ b/package.json
@@ -7,25 +7,36 @@
"license": "UNLICENSED",
"scripts": {
"build": "nest build",
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
+ "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
- "start:prod": "node dist/main",
+ "start:prod": "node dist/apps/BE-hackathon/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
- "test:e2e": "jest --config ./test/jest-e2e.json"
+ "test:e2e": "jest --config ./apps/BE-hackathon/test/jest-e2e.json"
},
"dependencies": {
"@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.0.1",
+ "@nestjs/jwt": "^11.0.0",
+ "@nestjs/mapped-types": "*",
+ "@nestjs/microservices": "^11.0.17",
+ "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.0.1",
"@nestjs/typeorm": "^11.0.0",
+ "amqp-connection-manager": "^4.1.14",
+ "amqplib": "^0.10.7",
+ "bcrypt": "^5.1.1",
+ "class-validator": "^0.14.1",
"mongodb": "^6.15.0",
+ "passport": "^0.7.0",
+ "passport-jwt": "^4.0.1",
+ "passport-local": "^1.0.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1",
"typeorm": "^0.3.22"
@@ -41,6 +52,8 @@
"@types/express": "^5.0.0",
"@types/jest": "^29.5.14",
"@types/node": "^22.10.7",
+ "@types/passport-jwt": "^4.0.1",
+ "@types/passport-local": "^1.0.38",
"@types/supertest": "^6.0.2",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
@@ -63,7 +76,7 @@
"json",
"ts"
],
- "rootDir": "src",
+ "rootDir": ".",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
@@ -71,7 +84,17 @@
"collectCoverageFrom": [
"**/*.(t|j)s"
],
- "coverageDirectory": "../coverage",
- "testEnvironment": "node"
+ "coverageDirectory": "./coverage",
+ "testEnvironment": "node",
+ "roots": [
+ "/apps/",
+ "/libs/"
+ ],
+ "moduleNameMapper": {
+ "^@app/contracts(|/.*)$": "/libs/contracts/src/$1",
+ "^@app/database(|/.*)$": "/libs/database/src/$1",
+ "^@app/guards(|/.*)$": "/libs/guards/src/$1",
+ "^@app/strategy(|/.*)$": "/libs/strategy/src/$1"
+ }
}
}
diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts
deleted file mode 100644
index d22f389..0000000
--- a/src/app.controller.spec.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Test, TestingModule } from '@nestjs/testing';
-import { AppController } from './app.controller';
-import { AppService } from './app.service';
-
-describe('AppController', () => {
- let appController: AppController;
-
- beforeEach(async () => {
- const app: TestingModule = await Test.createTestingModule({
- controllers: [AppController],
- providers: [AppService],
- }).compile();
-
- appController = app.get(AppController);
- });
-
- describe('root', () => {
- it('should return "Hello World!"', () => {
- expect(appController.getHello()).toBe('Hello World!');
- });
- });
-});
diff --git a/src/app.controller.ts b/src/app.controller.ts
deleted file mode 100644
index cce879e..0000000
--- a/src/app.controller.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Controller, Get } from '@nestjs/common';
-import { AppService } from './app.service';
-
-@Controller()
-export class AppController {
- constructor(private readonly appService: AppService) {}
-
- @Get()
- getHello(): string {
- return this.appService.getHello();
- }
-}
diff --git a/src/app.module.ts b/src/app.module.ts
deleted file mode 100644
index c8bbc5a..0000000
--- a/src/app.module.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Module } from '@nestjs/common';
-import { AppController } from './app.controller';
-import { AppService } from './app.service';
-import { ConfigModule } from '@nestjs/config';
-@Module({
- imports: [ConfigModule.forRoot()],
- controllers: [AppController],
- providers: [AppService],
-})
-export class AppModule { }
diff --git a/src/main.ts b/src/main.ts
deleted file mode 100644
index f76bc8d..0000000
--- a/src/main.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { NestFactory } from '@nestjs/core';
-import { AppModule } from './app.module';
-
-async function bootstrap() {
- const app = await NestFactory.create(AppModule);
- await app.listen(process.env.PORT ?? 3000);
-}
-bootstrap();
diff --git a/tsconfig.json b/tsconfig.json
index e4dbf2e..a3d8ea8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -16,6 +16,25 @@
"forceConsistentCasingInFileNames": true,
"noImplicitAny": false,
"strictBindCallApply": false,
- "noFallthroughCasesInSwitch": false
+ "noFallthroughCasesInSwitch": false,
+ "paths": {
+ "@app/contracts": [
+ "libs/contracts/src"
+ ],
+ "@app/contracts/*": [
+ "libs/contracts/src/*"
+ ],
+ "@app/strategy": [
+ "libs/strategy/src",
+ "libs/strategy/src"
+ ],
+ "@app/strategy/*": [
+ "libs/strategy/src/*",
+ "libs/strategy/src/*"
+ ],
+ "@libs/*": [
+ "libs/*"
+ ]
+ }
}
-}
+}
\ No newline at end of file