Skip to content

Commit 9bcc073

Browse files
authored
Merge pull request #19 from asepindrak/dev
Dev
2 parents cdeb63b + 0054280 commit 9bcc073

27 files changed

+1493
-560
lines changed

backend/package-lock.json

Lines changed: 32 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "commitflow-api",
3-
"version": "1.1.7",
3+
"version": "1.1.8",
44
"description": "Backend CommitFlow",
55
"author": "asepindrak",
66
"private": false,
@@ -34,10 +34,12 @@
3434
"@nestjs/swagger": "^11.2.1",
3535
"@nestjs/websockets": "^11.1.6",
3636
"@prisma/client": "^6.18.0",
37+
"@types/cookie-parser": "^1.4.10",
3738
"axios": "^1.12.2",
3839
"bcrypt": "^6.0.0",
3940
"class-transformer": "^0.5.1",
4041
"class-validator": "^0.14.2",
42+
"cookie-parser": "^1.4.7",
4143
"dayjs": "^1.11.19",
4244
"dotenv": "^17.2.3",
4345
"exceljs": "^4.4.0",

backend/src/app.module.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
11
// src/app.module.ts
2-
import { Module } from '@nestjs/common';
3-
import { ConfigModule } from '@nestjs/config';
4-
import { AskModule } from './ai-agent/ask.module';
5-
import { AppController } from './app.controller';
6-
import { AppService } from './app.service';
7-
import { UsersModule } from './users/users.module';
2+
import { Module } from "@nestjs/common";
3+
import { ConfigModule } from "@nestjs/config";
4+
import { AskModule } from "./ai-agent/ask.module";
5+
import { AppController } from "./app.controller";
6+
import { AppService } from "./app.service";
7+
import { UsersModule } from "./users/users.module";
88
import { AskController } from "./ai-agent/ask.controller";
99
import { AskService } from "./ai-agent/ask.service";
1010
import { AskGateway } from "./ai-agent/ask.gateway";
11-
import { ServeStaticModule } from '@nestjs/serve-static';
12-
import { join } from 'path';
11+
import { ServeStaticModule } from "@nestjs/serve-static";
12+
import { join } from "path";
1313
import { AuthModule } from "./auth/auth.module";
1414
import { JwtGuard } from "./common/guards/jwt.guard";
1515
import { SharedModule } from "./common/shared.module";
16-
import { UploadModule } from './upload/upload.module';
17-
import { ProjectManagementModule } from './project-management/project-management.module';
18-
import { EmailModule } from './email/email.module';
16+
import { UploadModule } from "./upload/upload.module";
17+
import { ProjectManagementModule } from "./project-management/project-management.module";
18+
import { EmailModule } from "./email/email.module";
19+
import { APP_GUARD } from "@nestjs/core";
1920

2021
@Module({
2122
imports: [
22-
// config global (baca .env)
2323
ConfigModule.forRoot({
2424
isGlobal: true,
25-
envFilePath: '.env',
25+
envFilePath: ".env",
2626
}),
27-
28-
// Serve folder public sebagai static files
2927
ServeStaticModule.forRoot({
30-
rootPath: join(__dirname, '..', 'public'),
31-
serveRoot: '/',
28+
rootPath: join(__dirname, "..", "public"),
29+
serveRoot: "/",
3230
}),
33-
3431
AuthModule,
3532
UsersModule,
3633
AskModule,
@@ -40,6 +37,15 @@ import { EmailModule } from './email/email.module';
4037
EmailModule,
4138
],
4239
controllers: [AppController, AskController],
43-
providers: [AppService, AskService, AskGateway, JwtGuard],
40+
providers: [
41+
AppService,
42+
AskService,
43+
AskGateway,
44+
// Register JwtGuard as a global guard via APP_GUARD so Reflector and DI work properly
45+
{
46+
provide: APP_GUARD,
47+
useClass: JwtGuard,
48+
},
49+
],
4450
})
45-
export class AppModule { }
51+
export class AppModule {}

backend/src/app.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import { Injectable } from "@nestjs/common";
33
@Injectable()
44
export class AppService {
55
getHello(): string {
6-
return `CommitFlow API (1.1.7) is running!`;
6+
return `CommitFlow API (1.1.8) is running!`;
77
}
88
}

backend/src/auth/auth.controller.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { AuthService } from "./auth.service";
1212
import { RegisterDto } from "./dto/register.dto";
1313
import { LoginDto } from "./dto/login.dto";
1414
import type { Request, Response } from "express";
15+
import { Public } from "./public.decorator";
1516

1617
const REFRESH_COOKIE_NAME = "refresh_token";
1718
const COOKIE_MAX_AGE = 7 * 24 * 60 * 60 * 1000; // 7 days in ms
@@ -37,6 +38,7 @@ const COOKIE_OPTIONS = {
3738
export class AuthController {
3839
constructor(private authService: AuthService) {}
3940

41+
@Public()
4042
@Post("anon")
4143
async anonLogin(
4244
@Body("userId") userId?: string,
@@ -56,6 +58,7 @@ export class AuthController {
5658
return { token: result.token, userId: result.user.id };
5759
}
5860

61+
@Public()
5962
@Post("register")
6063
async register(
6164
@Body() dto: RegisterDto,
@@ -77,11 +80,11 @@ export class AuthController {
7780
userId: result.user.id,
7881
user: result.user,
7982
workspaceId: result.workspace.id,
80-
teamMemberId: result.teamMember.id,
8183
clientTempId: result.clientTempId ?? null,
8284
};
8385
}
8486

87+
@Public()
8588
@Post("login")
8689
async login(
8790
@Body() dto: LoginDto,
@@ -104,19 +107,21 @@ export class AuthController {
104107
token: result.token,
105108
userId: result?.user?.id ?? "",
106109
user: result.user,
107-
teamMemberId: result?.teamMemberId,
108110
};
109111
}
110112

111113
// refresh endpoint: reads refresh_token cookie, verifies, rotates
114+
@Public()
112115
@HttpCode(200)
113116
@Post("refresh")
114117
async refresh(
115118
@Req() req: Request,
116119
@Res({ passthrough: true }) res: Response
117120
) {
118121
const token = req.cookies?.[REFRESH_COOKIE_NAME];
119-
if (!token) throw new UnauthorizedException("No refresh token");
122+
if (!token) {
123+
throw new UnauthorizedException("No refresh token");
124+
}
120125

121126
// attempt to verify and refresh via AuthService
122127
let payload: any;
@@ -137,9 +142,14 @@ export class AuthController {
137142
});
138143

139144
// return access token
140-
return { token: newTokens.accessToken };
145+
return {
146+
token: newTokens.token,
147+
userId: newTokens?.user?.id ?? "",
148+
user: newTokens.user,
149+
};
141150
}
142151

152+
@Public()
143153
@Post("logout")
144154
async logout(@Req() req: Request, @Res({ passthrough: true }) res: Response) {
145155
const token = req.cookies?.[REFRESH_COOKIE_NAME];

0 commit comments

Comments
 (0)