Skip to content

Commit

Permalink
feat: Date타입으로 반환되는 모든 값에 formatDate 함수 적용
Browse files Browse the repository at this point in the history
* refactor: 불필요한 TODO, FIXME 주석 제거

* refactor: DataSource type 명시

* feat(DateUtil): formatDate함수를 모든 반환객체에 적용할 수 있는 함수 추가

* feat: Entity 컬럼 중 모든 Date타입에 formatDate 함수를 적용하여 더 나은 형태로 반환
 - 시간대 적용 및 밀리초 부분 제거
 - 기존의 복잡했던 코드를 더 간단히 수정
 - 이로인해 불필요해진 interface 제거

* feat(categoriesRepository): 싱글톤 패턴 적용

* refactor: jwt.strategy 타입 명시
 - authValidateOrNext 함수를 이용하는 controllers의 req.userInfo.id를 req.userInfo?.id와 같이 옵셔널체이닝 적용 및 수정
 - 로그인으로 토큰을 받았더라도 토큰이 필요한 경우, 해당 시점에서의 사용자유효성 검사 추가
 - findUserInfoByUserId 함수를 validateUserInfo 함수로 함수명 수정 및 user.validate 폴더로 이동

* refactor(TokenDecoder): decodeToken 함수를 정적(static) 메소드로 변경
 - 상태 독립성, 편의성, 자원(메모리) 사용 최소화 기대
 - feat: Token 에러 핸들링 추가

* feat(findUserFeedsByUserId): userId가 특정되지 않을 경우 에러 반환

* feat(findUserCommentsByUserId): userId가 특정되지 않을 경우 에러 반환

* fix(jwt.strategy): decoded.id 타입 가드에 대한 조건문 에러 수정
  • Loading branch information
inchanS authored Feb 28, 2024
1 parent 9ee8923 commit 39c691c
Show file tree
Hide file tree
Showing 31 changed files with 298 additions and 308 deletions.
2 changes: 1 addition & 1 deletion src/controllers/comments.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class CommentsController {

getCommentList = async (req: Request, res: Response): Promise<void> => {
const feedId: number = Number(req.params.id);
const userId: number = req.userInfo.id;
const userId: number = req.userInfo?.id;

// TODO 무한스크롤
const result = await this.commentsService.getCommentList(feedId, userId);
Expand Down
6 changes: 3 additions & 3 deletions src/controllers/feeds.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Feed } from '../entities/feed.entity';
import { FeedsService } from '../services/feeds.service';
import { CustomError } from '../utils/util';
import { Estimation } from '../entities/estimation.entity';
import { ExtendedFeedlist } from '../types/feedList';
import { FeedList } from '../entities/viewEntities/viewFeedList.entity';

// 임시저장 ==================================================================
// 임시저장 게시글 리스트 --------------------------------------------------------
Expand All @@ -21,7 +21,7 @@ export class FeedsController {

// 임시저장 및 정식 게시글 불러오기 -----------------------------------------------------------
getFeed = async (req: Request, res: Response): Promise<void> => {
const user: number = req.userInfo.id;
const user: number = req.userInfo?.id;
const feedId: number = Number(req.params.feedId);

const result = await this.feedsService.getFeed(user, feedId, {
Expand Down Expand Up @@ -171,7 +171,7 @@ export class FeedsController {
const index: number = Number(req.query.index);
const limit: number = Number(req.query.limit);

const result: ExtendedFeedlist[] = await this.feedsService.getFeedList(
const result: FeedList[] = await this.feedsService.getFeedList(
categoryId,
index,
limit
Expand Down
9 changes: 6 additions & 3 deletions src/controllers/search.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Request, Response } from 'express';
import { SearchService } from '../services/search.service';
import { ExtendedFeedlist } from '../types/feedList';
import { FeedList } from '../entities/viewEntities/viewFeedList.entity';

class SearchController {
constructor(private searchService: SearchService) {}
Expand All @@ -19,8 +19,11 @@ class SearchController {
const limit: number = Number(req.query.limit);
const index: number = Number(req.query.index);

const result: ExtendedFeedlist[] =
await this.searchService.searchContentList(query, index, limit);
const result: FeedList[] = await this.searchService.searchContentList(
query,
index,
limit
);

res.status(200).json(result);
};
Expand Down
22 changes: 3 additions & 19 deletions src/controllers/users/userContent.controller.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,18 @@
// 유저의 가입정보 가져오기
import { Request, Response } from 'express';
import { UserContentService } from '../../services/users/userContent.service';
import { User } from '../../entities/users.entity';
import {
CommentListByUserId,
FeedListByUserId,
FeedSymbolListByUserId,
} from '../../types/user';
import { Pagination } from '../../types/feedList';

class UserContentController {
constructor(private userContentService: UserContentService) {}
getUserInfo = async (req: Request, res: Response): Promise<void> => {
let targetUserId: number = Number(req.params.id);
const loggedInUserId: number = req.userInfo.id;

if (!targetUserId) {
targetUserId = loggedInUserId;
}
const result: User = await this.userContentService.findUserInfoByUserId(
targetUserId
);

res.status(200).json(result);
};

// 유저의 모든 게시물 가져오기
getUserFeeds = async (req: Request, res: Response): Promise<void> => {
let targetUserId: number = Number(req.params.id);
const loggedInUserId: number = req.userInfo.id;
const loggedInUserId: number = req.userInfo?.id;

if (!targetUserId) {
targetUserId = loggedInUserId;
Expand All @@ -47,7 +31,7 @@ class UserContentController {
// 유저의 모든 덧글 가져오기
getUserComments = async (req: Request, res: Response): Promise<void> => {
let targetUserId: number = Number(req.params.id);
const loggedInUserId: number = req.userInfo.id;
const loggedInUserId: number = req.userInfo?.id;

if (!targetUserId) {
targetUserId = loggedInUserId;
Expand All @@ -70,7 +54,7 @@ class UserContentController {
// 유저의 모든 좋아요 가져오기
getUserFeedSymbols = async (req: Request, res: Response): Promise<void> => {
let targetUserId: number = Number(req.params.id);
const loggedInUserId: number = req.userInfo.id;
const loggedInUserId: number = req.userInfo?.id;

if (!targetUserId) {
targetUserId = loggedInUserId;
Expand Down
15 changes: 15 additions & 0 deletions src/controllers/users/validator.controller.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
import { Request, Response } from 'express';
import { ValidatorService } from '../../services/users/validator.service';
import { User } from '../../entities/users.entity';

class ValidatorController {
constructor(private validatorService: ValidatorService) {}
getUserInfo = async (req: Request, res: Response): Promise<void> => {
let targetUserId: number = Number(req.params.id);
const loggedInUserId: number = req.userInfo?.id;

if (!targetUserId) {
targetUserId = loggedInUserId;
}
const result: User = await this.validatorService.validateUserInfo(
targetUserId
);

res.status(200).json(result);
};

checkDuplicateNickname = async (
req: Request,
res: Response
Expand Down
19 changes: 14 additions & 5 deletions src/entities/base.entity.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import {
BaseEntity,
CreateDateColumn,
DeleteDateColumn,
PrimaryGeneratedColumn,
UpdateDateColumn,
ValueTransformer,
} from 'typeorm';
import { DateUtils } from '../utils/dateUtils';

export abstract class Base {
export const transformer: ValueTransformer = {
from: (value: Date) =>
value instanceof Date ? DateUtils.formatDate(value) : null,
to: (value: Date) => value,
};

export abstract class Base extends BaseEntity {
@PrimaryGeneratedColumn()
id!: number;

@CreateDateColumn({ type: 'timestamp' })
@CreateDateColumn({ type: 'timestamp', transformer: transformer })
created_at!: Date;

@UpdateDateColumn({ type: 'timestamp' })
@UpdateDateColumn({ type: 'timestamp', transformer: transformer })
updated_at!: Date;

@DeleteDateColumn({ type: 'timestamp' })
deleted_at?: Date;
@DeleteDateColumn({ type: 'timestamp', transformer: transformer })
deleted_at?: Date | null;
}
3 changes: 2 additions & 1 deletion src/entities/comment.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import { Column, Entity, JoinColumn, ManyToOne, OneToMany } from 'typeorm';
import { User } from './users.entity';
import { Feed } from './feed.entity';
import { Base } from './base.entity';
import { ExtendedUser } from '../types/comment';

@Entity('comments')
export class Comment extends Base {
@ManyToOne(() => User, users => users.comment, { nullable: false })
@JoinColumn({ name: 'userId' })
user: User;
user: ExtendedUser;

@ManyToOne(() => Feed, feeds => feeds.comment, { nullable: false })
@JoinColumn({ name: 'feedId' })
Expand Down
4 changes: 2 additions & 2 deletions src/entities/feed.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Category } from './category.entity';
import { FeedStatus } from './feedStatus.entity';
import { Comment } from './comment.entity';
import { FeedSymbol } from './feedSymbol.entity';
import { Base } from './base.entity';
import { Base, transformer } from './base.entity';
import { UploadFiles } from './uploadFiles.entity';

@Entity('feeds')
Expand Down Expand Up @@ -39,7 +39,7 @@ export class Feed extends Base {
@JoinColumn({ name: 'statusId' })
status: FeedStatus;

@Column({ type: 'timestamp', nullable: true })
@Column({ type: 'timestamp', nullable: true, transformer: transformer })
posted_at?: Date;

@OneToMany(() => Comment, comment => comment.feed)
Expand Down
28 changes: 3 additions & 25 deletions src/entities/users.entity.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,11 @@
import {
BaseEntity,
Column,
CreateDateColumn,
DeleteDateColumn,
Entity,
OneToMany,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import { Column, Entity, OneToMany } from 'typeorm';
import { Comment } from './comment.entity';
import { Feed } from './feed.entity';
import { FeedSymbol } from './feedSymbol.entity';
import { Base } from './base.entity';

@Entity('users')
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;

@CreateDateColumn({ type: 'timestamp' })
created_at?: Date;

@UpdateDateColumn({ type: 'timestamp' })
updated_at?: Date;

@DeleteDateColumn({ type: 'timestamp' })
deleted_at?: Date;

export class User extends Base {
@Column({ unique: true })
nickname: string;

Expand All @@ -45,7 +25,6 @@ export class User extends BaseEntity {
feedSymbol: FeedSymbol[];

constructor(
id: number,
nickname: string,
password: string,
email: string,
Expand All @@ -54,7 +33,6 @@ export class User extends BaseEntity {
feedSymbol: FeedSymbol[]
) {
super();
this.id = id;
this.nickname = nickname;
this.password = password;
this.email = email;
Expand Down
9 changes: 5 additions & 4 deletions src/entities/viewEntities/viewFeedList.entity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ViewColumn, ViewEntity } from 'typeorm';
import { transformer } from '../base.entity';

@ViewEntity({
expression: `
Expand Down Expand Up @@ -99,16 +100,16 @@ export class FeedList {
@ViewColumn()
imgCnt: number;

@ViewColumn()
@ViewColumn({ transformer: transformer })
createdAt: Date;

@ViewColumn()
@ViewColumn({ transformer: transformer })
updatedAt: Date;

@ViewColumn()
@ViewColumn({ transformer: transformer })
postedAt: Date;

@ViewColumn()
@ViewColumn({ transformer: transformer })
deletedAt: Date;

@ViewColumn()
Expand Down
Loading

0 comments on commit 39c691c

Please sign in to comment.