Skip to content

Commit aa9683f

Browse files
Merge branch 'develop' into feature-be-#302
2 parents 36b696c + d1228f2 commit aa9683f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+559
-161
lines changed

.gitignore

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
.env*
44
*.local
55
.turbo
6-
.crt
7-
.key
6+
*.crt
7+
*.key
88
!Dockerfile.local
99

1010
# compiled output
@@ -52,3 +52,6 @@ lerna-debug.log*
5252
!.vscode/launch.json
5353
!.vscode/extensions.json
5454
db.sqlite
55+
56+
*.crt
57+
*.key

apps/backend/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"build": "nest build",
1010
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
1111
"start": "nest start",
12-
"dev": "nest start --watch",
12+
"dev": "nest start --tsc --watch --preserveWatchOutput --watchAssets",
1313
"start:debug": "nest start --debug --watch",
1414
"start:prod": "node dist/main",
1515
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
@@ -30,6 +30,7 @@
3030
"@nestjs/platform-express": "^10.0.0",
3131
"@nestjs/platform-socket.io": "^10.4.8",
3232
"@nestjs/platform-ws": "^10.4.7",
33+
"@nestjs/schedule": "^4.1.1",
3334
"@nestjs/serve-static": "^4.0.2",
3435
"@nestjs/swagger": "^8.0.5",
3536
"@nestjs/typeorm": "^10.0.2",
@@ -38,6 +39,7 @@
3839
"@types/multer": "^1.4.12",
3940
"class-transformer": "^0.5.1",
4041
"class-validator": "^0.14.1",
42+
"ioredis": "^5.4.1",
4143
"cookie-parser": "^1.4.7",
4244
"lib0": "^0.2.98",
4345
"passport": "^0.7.0",

apps/backend/src/app.module.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,20 @@ import { AuthModule } from './auth/auth.module';
2020
import { UserModule } from './user/user.module';
2121
import { WorkspaceModule } from './workspace/workspace.module';
2222
import { RoleModule } from './role/role.module';
23+
import { RedisService } from './redis/redis.service';
24+
import { RedisModule } from './redis/redis.module';
25+
import { ScheduleModule } from '@nestjs/schedule';
26+
import { TasksService } from './tasks/tasks.service';
2327

2428
@Module({
2529
imports: [
30+
ScheduleModule.forRoot(),
2631
ServeStaticModule.forRoot({
2732
rootPath: path.join(__dirname, '..', '..', 'frontend', 'dist'),
2833
}),
2934
ConfigModule.forRoot({
3035
isGlobal: true,
31-
envFilePath: path.join(__dirname, '..', '..', '..', '.env'), // * nest 디렉터리 기준
36+
envFilePath: '/app/.env', // * docker 내부 디렉터리 기준
3237
}),
3338
TypeOrmModule.forRootAsync({
3439
imports: [ConfigModule],
@@ -54,8 +59,9 @@ import { RoleModule } from './role/role.module';
5459
UserModule,
5560
WorkspaceModule,
5661
RoleModule,
62+
RedisModule,
5763
],
5864
controllers: [AppController],
59-
providers: [AppService],
65+
providers: [AppService, RedisService, TasksService],
6066
})
6167
export class AppModule {}

apps/backend/src/page/page.repository.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,13 @@ export class PageRepository extends Repository<Page> {
1919
},
2020
});
2121
}
22+
23+
async bulkUpdate(pages) {
24+
await this.createQueryBuilder()
25+
.insert()
26+
.into(Page)
27+
.values(pages)
28+
.orUpdate(['title', 'content'], ['id'])
29+
.execute();
30+
}
2231
}

apps/backend/src/page/page.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ export class PageService {
8181
return await this.pageRepository.save(newPage);
8282
}
8383

84+
async updateBulkPage(pages: UpdatePageDto[]) {
85+
await this.pageRepository.bulkUpdate(pages);
86+
}
87+
8488
async findPageById(id: number): Promise<Page> {
8589
// 페이지를 조회한다.
8690
const page = await this.pageRepository.findOneBy({ id });
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Module } from '@nestjs/common';
2+
import { RedisService } from './redis.service';
3+
4+
@Module({
5+
providers: [RedisService],
6+
exports: [RedisService],
7+
})
8+
export class RedisModule {}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { RedisService } from './redis.service';
3+
4+
describe('RedisService', () => {
5+
let service: RedisService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [RedisService],
10+
}).compile();
11+
12+
service = module.get<RedisService>(RedisService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { Injectable } from '@nestjs/common';
2+
import Redis from 'ioredis';
3+
type RedisPage = {
4+
title: string;
5+
content: string;
6+
};
7+
@Injectable()
8+
export class RedisService {
9+
private readonly redisClient: Redis;
10+
11+
constructor() {
12+
this.redisClient = new Redis({
13+
host: process.env.REDIS_HOST,
14+
port: parseInt(process.env.REDIS_PORT),
15+
});
16+
}
17+
18+
async getAllKeys() {
19+
return await this.redisClient.keys('*');
20+
}
21+
22+
async get(key: string) {
23+
const data = await this.redisClient.hgetall(key);
24+
console.log(data);
25+
return Object.fromEntries(
26+
Object.entries(data).map(([field, value]) => [field, value]),
27+
) as RedisPage;
28+
}
29+
30+
async set(key: string, value: object) {
31+
console.log('set', Object.entries(value));
32+
return await this.redisClient.hset(key, Object.entries(value));
33+
}
34+
35+
async setField(key: string, field: string, value: string) {
36+
return await this.redisClient.hset(key, field, value);
37+
}
38+
39+
async delete(key: string) {
40+
return await this.redisClient.del(key);
41+
}
42+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { RoleController } from './role.controller';
3+
import { RoleService } from './role.service';
4+
5+
describe('RoleController', () => {
6+
let controller: RoleController;
7+
let roleService: RoleService;
8+
9+
beforeEach(async () => {
10+
const module: TestingModule = await Test.createTestingModule({
11+
controllers: [RoleController],
12+
providers: [
13+
{
14+
provide: RoleService,
15+
useValue: {},
16+
},
17+
],
18+
}).compile();
19+
20+
controller = module.get<RoleController>(RoleController);
21+
roleService = module.get<RoleService>(RoleService);
22+
});
23+
24+
it('should be defined', () => {
25+
expect(controller).toBeDefined();
26+
expect(roleService).toBeDefined();
27+
});
28+
});

apps/backend/src/role/role.service.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,8 @@ describe('RoleService', () => {
3737

3838
it('should be defined', () => {
3939
expect(service).toBeDefined();
40+
expect(userRepository).toBeDefined();
41+
expect(roleRepository).toBeDefined();
42+
expect(workspaceRepository).toBeDefined();
4043
});
4144
});

0 commit comments

Comments
 (0)