Skip to content

Commit

Permalink
refactor(#10): 레포지토리 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
NicoDora committed Oct 4, 2023
1 parent 1137552 commit 87ebcfe
Show file tree
Hide file tree
Showing 12 changed files with 93 additions and 62 deletions.
3 changes: 2 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { UserImageService } from './users/services/user-image.service';
import { AuthModule } from './auth/modules/auth.module';
import { CommentModule } from './comments/comment.module';
import { UserModule } from './users/user.module';
Expand Down Expand Up @@ -38,7 +39,7 @@ import * as mongoose from 'mongoose';
NoticeModule,
],
controllers: [],
providers: [S3Service],
providers: [UserImageService, S3Service],
})
export class AppModule implements NestModule {
private readonly isDev: boolean =
Expand Down
2 changes: 1 addition & 1 deletion src/auth/controllers/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AuthGuard } from '@nestjs/passport';
import { AuthService } from '../service/auth.service';
import { AuthService } from '../services/auth.service';
import { Controller, Delete, Get, Headers, Req, UseGuards } from '@nestjs/common';
import { S3Service } from 'src/common/s3/s3.service';

Expand Down
7 changes: 4 additions & 3 deletions src/auth/modules/auth.module.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { Module } from '@nestjs/common';
import { AuthController } from '../controllers/auth.controller';
import { AuthService } from '../service/auth.service';
import { UserRepository } from 'src/users/repository/user.repository';
import { AuthService } from '../services/auth.service';
import { UserRepository } from 'src/users/repositories/user.repository';
import { NaverStrategy } from 'src/common/auth/naver.strategy';
import { KakaoStrategy } from 'src/common/auth/kakao.strategy';
import { S3Service } from 'src/common/s3/s3.service';
import { UserImageRepository } from 'src/users/repositories/user-image.repository';

@Module({
imports: [],
controllers: [AuthController],
providers: [AuthService, UserRepository, NaverStrategy, KakaoStrategy, S3Service],
providers: [AuthService, UserRepository, UserImageRepository, NaverStrategy, KakaoStrategy, S3Service],
})
export class AuthModule {}
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { Injectable } from '@nestjs/common';
import { UserRepository } from 'src/users/repository/user.repository';
import { UserRepository } from 'src/users/repositories/user.repository';
import * as jwt from 'jsonwebtoken';
import * as dotenv from 'dotenv';
import { UserImageRepository } from 'src/users/repositories/user-image.repository';

dotenv.config();

@Injectable()
export class AuthService {
constructor(private readonly userRepository: UserRepository) {}
constructor(
private readonly userRepository: UserRepository,
private readonly userImageRepository: UserImageRepository,
) {}

async naverLogin(req) {
const userInfo = req.user; // 네이버에서 전달받은 사용자 정보
Expand All @@ -26,9 +30,9 @@ export class AuthService {
const newUser = await this.userRepository.createUser(userInfo.user);
const userId = newUser.id;
if (!userInfo.user.profileImage) {
await this.userRepository.uploadUserImage(userId, process.env.DEFAULT_USER_IMAGE);
await this.userImageRepository.uploadUserImage(userId, process.env.DEFAULT_USER_IMAGE);
} else {
await this.userRepository.uploadUserImage(userId, userInfo.user.profileImage);
await this.userImageRepository.uploadUserImage(userId, userInfo.user.profileImage);
}
return { userId, naverAccessToken, naverRefreshToken };
}
Expand All @@ -51,9 +55,9 @@ export class AuthService {
const newUser = await this.userRepository.createUser(userInfo.user);
const userId = newUser.id;
if (!userInfo.user.profileImage) {
await this.userRepository.uploadUserImage(userId, process.env.DEFAULT_USER_IMAGE);
await this.userImageRepository.uploadUserImage(userId, process.env.DEFAULT_USER_IMAGE);
} else {
await this.userRepository.uploadUserImage(userId, userInfo.user.profileImage);
await this.userImageRepository.uploadUserImage(userId, userInfo.user.profileImage);
}
return { userId, kakaoAccessToken, kakaoRefreshToken };
}
Expand Down
13 changes: 7 additions & 6 deletions src/users/controllers/user-image.controller.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
import { UserRepository } from 'src/users/repository/user.repository';
import { UserRepository } from 'src/users/repositories/user.repository';
import { Controller, InternalServerErrorException, Param, Patch, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { S3Service } from 'src/common/s3/s3.service';
import { UserImageRepository } from '../repositories/user-image.repository';

@Controller('user/image')
export class UserImageController {
constructor(
private readonly s3Service: S3Service,
private userRepository: UserRepository
private readonly userRepository: UserRepository,
private readonly userImageRepository : UserImageRepository
) {}

@Patch(':userId')
@UseInterceptors(FileInterceptor('file'))
async uploadImage(@Param('userId') userId: number, @UploadedFile() file: Express.Multer.File) {
userId = parseInt(userId.toString().slice(1)); // userId 앞에 붙는 ':' 제거

const res = await this.s3Service.imgUpload(file, userId); // S3에 이미지 업로드
if (res === false) { // S3에 이미지 업로드 실패
if (!res) { // S3에 이미지 업로드 실패
throw new InternalServerErrorException('S3 이미지 업로드에 실패했습니다.');
} else { // S3에 이미지 업로드 성공
const imageUrl = res.url; // S3에 업로드된 이미지 URL

const checkUserImage = (await this.userRepository.checkUserImage(userId)).imageUrl; // DB에 이미지가 있는지 확인
const checkUserImage = (await this.userImageRepository.checkUserImage(userId)).imageUrl; // DB에 이미지가 있는지 확인
const imageUrlParts = checkUserImage.split('/');
const imageKey = imageUrlParts[imageUrlParts.length - 1]; // S3에 업로드된 이미지의 키
const dbImageUrl = imageUrlParts[imageUrlParts.length - 2]; // 이미지 제공자 이름
Expand All @@ -30,7 +31,7 @@ export class UserImageController {
await this.s3Service.deleteImage(imageKey); // S3에 업로드된 기존 이미지 삭제
}

const updateUserImage = await this.userRepository.updateUserImage(userId, imageUrl); // DB에 이미지 URL 업데이트
const updateUserImage = await this.userImageRepository.updateUserImage(userId, imageUrl); // DB에 이미지 URL 업데이트
if (!updateUserImage) {
throw new InternalServerErrorException('사용자 이미지 업데이트에 실패했습니다.');
} else {
Expand Down
File renamed without changes.
10 changes: 8 additions & 2 deletions src/users/entities/user-image.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ export class UserImage {
@PrimaryGeneratedColumn()
id: number;

@OneToOne(() => User, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'user_id' })
@Column({ name: 'user_id' })
userId: number;

@Column({ name: 'image_url' })
imageUrl: string;

@OneToOne(() => User, (userId: User) => userId.userImage, {
onDelete: 'CASCADE',
})

@JoinColumn({ name: 'user_id' })
user: User;
}
8 changes: 7 additions & 1 deletion src/users/entities/user.entity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm";
import { UserImage } from "./user-image.entity";

@Entity({
name: 'user'
Expand All @@ -22,4 +23,9 @@ export class User {

@Column({ default: false })
admin: boolean;

@OneToOne(() => UserImage, (userImage) => userImage.user, {
onDelete: 'CASCADE',
})
userImage: UserImage;
}
46 changes: 46 additions & 0 deletions src/users/repositories/user-image.repository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { Injectable, NotFoundException } from "@nestjs/common";
import { EntityManager } from "typeorm";
import { UserImage } from "../entities/user-image.entity";

@Injectable()
export class UserImageRepository {
constructor(
private readonly entityManager: EntityManager,
) {}

async checkUserImage(userId: number): Promise<UserImage> {
const userImage = await this.entityManager.findOne(UserImage, { where: { userId } });

if (!userImage) {
throw new NotFoundException('사용자 이미지를 찾을 수 없습니다.');
} else {
return userImage;
}
}

async uploadUserImage(userId: number, imageUrl: string): Promise<UserImage> {
const userImage = new UserImage();
userImage.userId = userId;
userImage.imageUrl = imageUrl;

return this.entityManager.save(userImage);
}

async updateUserImage(userId: number, newImageUrl: string): Promise<UserImage | null> {
try {
const userImage = await this.entityManager.findOne(UserImage, { where: { userId } });

if (!userImage) {
throw new NotFoundException('사용자 이미지를 찾을 수 없습니다.');
} else {
userImage.imageUrl = newImageUrl;
await this.entityManager.save(userImage);

return userImage;
}
} catch (error) {
console.error('이미지 업데이트 오류:', error);
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { UserImage } from './../entities/user-image.entity';
import { Injectable, NotFoundException } from '@nestjs/common';
import { EntityManager } from 'typeorm';
import { User } from '../entities/user.entity';
Expand Down Expand Up @@ -45,43 +44,4 @@ export class UserRepository {
return null;
}
}

async checkUserImage(userId: number): Promise<UserImage> {
const userImage = await this.entityManager.findOne(UserImage, { where: { userId } });

if (!userImage) {
throw new NotFoundException('사용자 이미지를 찾을 수 없습니다.');
} else {
return userImage;
}
}

async uploadUserImage(userId: number, imageUrl: string): Promise<UserImage> {
const userImage = new UserImage();
userImage.userId = userId;
userImage.imageUrl = imageUrl;

return this.entityManager.save(userImage);
}

async updateUserImage(userId: number, newImageUrl: string): Promise<UserImage | null> {
try {
console.log('userId:',userId);

const userImage = await this.entityManager.findOne(UserImage, { where: { userId }});
console.log('userImage:', userImage);

if (!userImage) {
throw new NotFoundException('사용자 이미지를 찾을 수 없습니다.');
} else {
userImage.imageUrl = newImageUrl;
await this.entityManager.save(userImage);

return userImage;
}
} catch (error) {
console.error('이미지 업데이트 오류:', error);
return null;
}
}
}
4 changes: 4 additions & 0 deletions src/users/services/user-image.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserImageService {}
6 changes: 4 additions & 2 deletions src/users/user.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UserImageController } from './controllers/user-image.controller';
import { S3Service } from 'src/common/s3/s3.service';
import { UserRepository } from './repository/user.repository';
import { UserRepository } from './repositories/user.repository';
import { UserImageRepository } from './repositories/user-image.repository';

@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserImageController],
providers: [S3Service, UserImageController, UserRepository],
providers: [
S3Service, UserImageController, UserRepository, UserImageRepository],
})
export class UserModule {}

0 comments on commit 87ebcfe

Please sign in to comment.