⚙️ Express 미들웨어

image.png

🍒 공통 미션

기존에 구현했던 API의 응답 검토하기

image.png

schema.prisma

generator client {
  provider = "prisma-client-js"
  output   = "./node_modules/@prisma/client"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  nickname  String   @unique
  reviews   Review[] @relation("UserReviews")
  missions  Mission[] @relation("UserMissions")
}

model Store {
  id        Int      @id @default(autoincrement())
  name      String
  location  String
  missions  Mission[] @relation("StoreMissions")
  reviews   Review[] @relation("StoreReviews")
}

model Review {
  id      Int      @id @default(autoincrement())
  content String
  rating  Float
  date    DateTime @default(now())
  userId  Int
  storeId Int      // 필드 추가
  user    User     @relation("UserReviews", fields: [userId], references: [id])
  store   Store    @relation("StoreReviews", fields: [storeId], references: [id])  // 수정 완료
}

model Mission {
  id          Int    @id @default(autoincrement())
  title       String
  description String
  reward      Int
  status      String
  userId      Int
  storeId     Int
  user        User   @relation("UserMissions", fields: [userId], references: [id])
  store       Store  @relation("StoreMissions", fields: [storeId], references: [id])
}

mission.controller.js

import {
  getUserMissions,
  completeMission,
  getStoreMissions,
} from "../services/mission.service.js";

export const fetchUserMissions = async (req, res, next) => {
  try {
    const { userId } = req.params;
    const missions = await getUserMissions(parseInt(userId));
    res.json(missions);
  } catch (error) {
    next(error);
  }
};

export const markMissionComplete = async (req, res, next) => {
  try {
    const { missionId } = req.params;
    const updatedMission = await completeMission(parseInt(missionId));
    res.json(updatedMission);
  } catch (error) {
    next(error);
  }
};

export const fetchStoreMissions = async (req, res, next) => {
  try {
    const { storeId } = req.params;
    const missions = await getStoreMissions(parseInt(storeId));
    res.json(missions);
  } catch (error) {
    next(error);
  }
};

review.controller.js

import { getUserReviews } from "../services/review.service.js";

export const fetchUserReviews = async (req, res, next) => {
  try {
    const { userId } = req.params;
    const reviews = await getUserReviews(parseInt(userId));
    res.json(reviews);
  } catch (error) {
    next(error);
  }
};

mission.dto.js

export class MissionDTO {
  constructor(id, userId, title, reward, status, description, createdAt) {
    this.id = id;
    this.userId = userId;
    this.title = title;
    this.reward = reward;
    this.status = status;
    this.description = description;
    this.createdAt = createdAt;
  }
}