Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(backend): migrate to nestjs #68

Merged
merged 10 commits into from
Jun 3, 2024
Prev Previous commit
Next Next commit
refactor(domain): publish the domain package as a nestjs module
  • Loading branch information
tericcabrel committed May 23, 2024
commit 99efb958d4a42268c81a469e2cc533b94ed5d708
1 change: 1 addition & 0 deletions apps/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"@nestjs/config": "3.2.2",
"@nestjs/core": "10.3.8",
"@nestjs/platform-express": "10.3.8",
"@prisma/client": "5.14.0",
"reflect-metadata": "0.2.2",
"rxjs": "7.8.1",
"zod": "3.23.8"
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/src/app.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export class AppController {
constructor(private readonly appService: AppService) {}

@Get()
getHello(): string {
async getHello(): Promise<string> {
return this.appService.getHello();
}
}
22 changes: 18 additions & 4 deletions apps/backend/src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { Logger, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { DomainModule } from '@snipcode/domain';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import appConfig, { validate } from './configs/environment';
import appConfig, { EnvironmentVariables, validate } from './configs/environment';

@Module({
controllers: [AppController],
Expand All @@ -14,7 +15,20 @@ import appConfig, { validate } from './configs/environment';
load: [appConfig],
validate,
}),
DomainModule.forRootAsync({
inject: [ConfigService],
isGlobal: true,
useFactory: (configService: ConfigService<EnvironmentVariables, true>) => {
return {
convertKit: {
apiKey: '',
formId: '',
},
databaseUrl: configService.get('DATABASE_URL'),
};
},
}),
],
providers: [AppService],
providers: [Logger, AppService],
})
export class AppModule {}
19 changes: 17 additions & 2 deletions apps/backend/src/app.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
import { Injectable } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common';
import { RoleService, UserService } from '@snipcode/domain';

@Injectable()
export class AppService {
getHello(): string {
constructor(
private readonly roleService: RoleService,
private readonly userService: UserService,
private logger: Logger,
) {}

async getHello(): Promise<string> {
const users = await this.userService.findByEmail('[email protected]');

this.logger.log(users);

const roles = await this.roleService.findAll();

this.logger.log(roles);

return 'Hello World!';
}
}
2 changes: 2 additions & 0 deletions apps/backend/src/configs/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import { registerAs } from '@nestjs/config';
import { z } from 'zod';

export default registerAs('app', () => ({
databaseUrl: process.env.DATABASE_URL,
env: process.env.NODE_ENV,
host: process.env.HOST,
port: parseInt(process.env.PORT ?? '7501', 10),
}));

const EnvironmentVariablesSchema = z.object({
DATABASE_URL: z.string(),
HOST: z.string(),
NODE_ENV: z.union([z.literal('development'), z.literal('production'), z.literal('test')]),
PORT: z.number({ coerce: true }).min(7000).max(8000),
Expand Down
7 changes: 7 additions & 0 deletions apps/backend/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ const bootstrap = async () => {

await app.listen(port, () => {
logger.log(`Server ready at ${host}:${port}`);
const object = {
age: 23,
birthDate: new Date(),
name: 'marion',
};

logger.log(object);
// logger.log(`Server ready at ${host}:${port}${graphqlServer.graphqlPath}`);
});
};
Expand Down
2 changes: 1 addition & 1 deletion apps/backend/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"path": "../../packages/utils"
},
{
"path": "../../packages/logger"
"path": "../../packages/logger-old"
}
]
}
2 changes: 1 addition & 1 deletion apps/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ These packages are located in the folder `packages`, so you might need to change
Here are the packages used in this project:

* [@snipcode/domain](../../packages/domain)
* [@snipcode/logger](../../packages/logger)
* [@snipcode/logger](../../packages/logger-old)
* [@snipcode/utils](../../packages/utils)

## Set up the project
Expand Down
2 changes: 1 addition & 1 deletion apps/core/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"path": "../../packages/utils"
},
{
"path": "../../packages/logger"
"path": "../../packages/logger-old"
},
{
"path": "../../packages/domain"
Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
"cache:login": "turbo login",
"cache:link": "turbo link",
"cache:disable": "turbo unlink",
"prerelease": "changeset",
"branch:create": "pscale branch create core-db $(git rev-parse --abbrev-ref HEAD)"
"prerelease": "changeset"
},
"workspaces": [
"packages/domain",
Expand Down
11 changes: 11 additions & 0 deletions packages/domain/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = {
root: true,
extends: '../../.eslintrc.json',
ignorePatterns: ['dist', '.eslintrc.js'],
parserOptions: {
ecmaVersion: 2023,
sourceType: 'module',
project: 'tsconfig.json',
tsconfigRootDir: __dirname,
},
};
12 changes: 0 additions & 12 deletions packages/domain/.eslintrc.json

This file was deleted.

67 changes: 14 additions & 53 deletions packages/domain/index.ts
Original file line number Diff line number Diff line change
@@ -1,53 +1,14 @@
import { Folder } from './src/entities/folder';
import { Role, RoleName } from './src/entities/role';
import { Session } from './src/entities/session';
import { Snippet, SnippetVisibility } from './src/entities/snippet';
import { OauthProvider, User } from './src/entities/user';
import { CreateFolderDto } from './src/folders/dtos/create-folder-dto';
import { CreateUserRootFolderDto } from './src/folders/dtos/create-user-root-folder-dto';
import { UpdateFolderDto } from './src/folders/dtos/update-folder-dto';
import { FolderService } from './src/folders/folder.service';
import { NewsletterService } from './src/newsletters/newsletter.service';
import { CreateRoleDto } from './src/roles/dtos/create-role-dto';
import { RoleService } from './src/roles/role.service';
import { CreateSessionDto } from './src/sessions/dtos/create-session-dto';
import { SessionService } from './src/sessions/session.service';
import { CreateSnippetDto } from './src/snippets/dtos/create-snippet-dto';
import { DeleteSnippetDto } from './src/snippets/dtos/delete-snippet-dto';
import { UpdateSnippetDto } from './src/snippets/dtos/update-snippet-dto';
import { SnippetService } from './src/snippets/snippet.service';
import { CreateUserDto } from './src/users/dtos/create-user-dto';
import { UpdateUserDto } from './src/users/dtos/update-user-dto';
import { UserService } from './src/users/user.service';
import { dbID } from './src/utils/id';

export { dbID };
export { PrismaClient, prisma as dbClient } from './src/utils/prisma';
export type { Role, RoleName, User, OauthProvider, Folder, Session, Snippet, SnippetVisibility };

const roleService = new RoleService();
const userService = new UserService();
const folderService = new FolderService();
const snippetService = new SnippetService();
const sessionService = new SessionService();

export {
folderService,
roleService,
sessionService,
snippetService,
userService,
CreateRoleDto,
CreateSessionDto,
CreateUserDto,
DeleteSnippetDto,
UpdateUserDto,
CreateFolderDto,
CreateSnippetDto,
CreateUserRootFolderDto,
NewsletterService,
UpdateSnippetDto,
UpdateFolderDto,
};

export type { RoleService, UserService, FolderService, SessionService, SnippetService };
export { DomainModule } from './src/domain.module';
export { PrismaService } from './src/prisma.service';
export { UserService } from './src/services/users/user.service';
export { RoleService } from './src/services/roles/role.service';
export { FolderService } from './src/services/folders/folder.service';
export { SnippetService } from './src/services/snippets/snippet.service';
export { SessionService } from './src/services/sessions/session.service';
export { NewsletterService } from './src/services/newsletters/newsletter.service';
export { Folder } from './src/services/folders/folder.entity';
export { Role, RoleName } from './src/services/roles/role.entity';
export { Session } from './src/services/sessions/session.entity';
export { Snippet, SnippetVisibility } from './src/services/snippets/snippet.entity';
export { OauthProvider, User } from './src/services/users/user.entity';
export { dbID } from './src/utils/db-id';
24 changes: 13 additions & 11 deletions packages/domain/jest.config.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
import type { Config } from '@jest/types';

const config: Config.InitialOptions = {
roots: ['.'],
preset: 'ts-jest',
testMatch: ['**/?(*.)+(spec|test).[jt]s'],
testEnvironment: 'node',
clearMocks: true,
maxWorkers: 1,
snapshotFormat: {
printBasicPrototype: false,
},
coverageDirectory: 'coverage',
collectCoverage: false, // When set to true, coverage is performed even if coverage flag isn't provided
collectCoverage: false,
// When set to true, coverage is performed even if coverage flag isn't provided
collectCoverageFrom: ['src/**/*.ts', '!src/index.ts'],
coverageDirectory: 'coverage',
coverageReporters: ['json', 'lcov', 'text', 'text-summary'],
coverageThreshold: {
global: {
branches: 40,
Expand All @@ -21,7 +15,15 @@ const config: Config.InitialOptions = {
statements: 60,
},
},
coverageReporters: ['json', 'lcov', 'text', 'text-summary'],
maxWorkers: 1,
preset: 'ts-jest',
roots: ['.'],
snapshotFormat: {
printBasicPrototype: false,
},
testEnvironment: 'node',
testMatch: ['**/?(*.)+(spec|test).[jt]s'],
testPathIgnorePatterns: ['dist'],
};

export default config;
6 changes: 4 additions & 2 deletions packages/domain/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"license": "MIT",
"scripts": {
"build": "tsc --project tsconfig.prod.json",
"clean": "rm -rf .turbo dist",
"clean": "rm -rf .turbo dist coverage",
"lint": "eslint --fix",
"db:dev:create": "pscale branch create core-db $(git rev-parse --abbrev-ref HEAD)",
"db:dev:connect": "pscale connect core-db $(git rev-parse --abbrev-ref HEAD) --port 3311",
Expand All @@ -29,11 +29,13 @@
"@bugsnag/cuid": "3.1.1",
"@prisma/client": "5.14.0",
"@snipcode/utils": "workspace:*",
"axios": "1.6.8",
"axios": "1.7.2",
"bcryptjs": "2.4.3",
"unique-username-generator": "1.3.0"
},
"devDependencies": {
"@nestjs/common": "10.3.8",
"@nestjs/testing": "10.3.8",
"@ngneat/falso": "7.2.0",
"@types/bcryptjs": "2.4.6",
"nock": "13.5.4",
Expand Down
1 change: 1 addition & 0 deletions packages/domain/src/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const DOMAIN_SERVICES_OPTIONS = 'DOMAIN_SERVICES_OPTIONS';
Loading