내배캠 48일차

·2022년 12월 31일
0

내일배움캠프

목록 보기
50/142
post-thumbnail

todo

  • 프로젝트 파일 구성
  • 3계층 API 설계

프로젝트 파일 구성

assets
ㄴindex.html
__tests__
ㄴunit
ㄴintegration
config
controllers
services
repositories
migrations
models
node._modules
app.js
jest.config.js
package-lock.json
package.json

=> ejs사용하기 위해서 assets파일 대신 views파일 생성!

app.js에서

//ejs설정
app.set("view engine", "ejs");
app.set("views", __dirname + "/views");
app.use(express.static(__dirname + "/views")); //정적파일, 이미지파일

터미널에서

npm i ejs --save

router설정

index.js

//routes/index.js
const express = require("express");
const router = express.Router();

const laundryRouter = require("./laundry.routes");
router.use("/laundry", laundryRouter);

module.exports = router;

## laundry.routes.js
```javascript
//routes/laundry.routes.js
const express = require("express");
const router = express.Router();

const LaundryController = require("../controllers/laundry.controller");
const laundryController = new LaundryController();

// router.get('/', registerController.getPosts);
router.post("/apply/:userId", laundryController.createApply);
router.get("/:userId", laundryController.getApplyById);

module.exports = router;

3계층 API 설계

controller

//controllers/laundry.controller.js
const LaundryService = require("../services/laundry.service");

class LaundryController {
  laundryService = new LaundryService();

  getApplyById = async (req, res, next) => {
    //아직 로그인기능 없어서 임의로 해둠
    const { userId } = req.params;

    const laundry = await this.laundryService.findApplyById(userId);

    res.status(200).json({ data: laundry });
  };

  createApply = async (req, res, next) => {
    try {
      const {
        laundryName,
        laundryContent,
        laundryAddress,
        laundryImg,
        requests,
      } = req.body;

      //아직 로그인기능 없어서 임의로 해둠
      const userId = 1;

      if (!laundryName || !laundryContent || !laundryAddress || !laundryImg)
        throw new Error("InvalidParamsError");

      const createApplyData = await this.laundryService.createApply(
        laundryName,
        laundryContent,
        laundryAddress,
        laundryImg,
        requests,
        userId
      );

      res.status(201).json({ data: createApplyData });
    } catch (error) {
      res.status(400).json({ errorMessage: error.message });
    }
  };
}

module.exports = LaundryController;

service

//services/laundry.service.js
const LaundryRepository = require("../repositories/laundry.repository");
const { laundry } = require("../models/index");

class LaundryService {
  laundryRepository = new LaundryRepository(laundry);

  findApplyById = async (userId) => {
    const allLaundryById = await this.laundryRepository.findApplyById(userId);

    allLaundryById.sort((a, b) => {
      return b.createAt - a.createAt;
    });

    return allLaundryById.map((laundry) => {
      return {
        laundryName: laundry.laundryName,
        laundryContent: laundry.laundryContent,
        laundryAddress: laundry.laundryAddress,
        laundryImg: laundry.laundryImg,
        requests: laundry.requests,
        userId: laundry.userId,
      };
    });
  };

  createApply = async (
    laundryName,
    laundryContent,
    laundryAddress,
    laundryImg,
    requests,
    userId
  ) => {
    const createApplyData = await this.laundryRepository.createApply(
      laundryName,
      laundryContent,
      laundryAddress,
      laundryImg,
      requests,
      userId
    );

    return {
      laundryName: createApplyData.laundryName,
      laundryContent: createApplyData.laundryContent,
      laundryAddress: createApplyData.laundryAddress,
      laundryImg: createApplyData.laundryImg,
      requests: createApplyData.requests,
    };
  };
}

module.exports = LaundryService;

repository

// repositorys/laundry.repository.js
class LaundryRepository {
  constructor(Model) {
    this.Model = Model;
  }

  findApplyById = async (userId) => {
    const applies = await this.Model.findAll({ where: { userId: userId } });

    return applies;
  };

  createApply = async (
    laundryName,
    laundryContent,
    laundryAddress,
    laundryImg,
    requests,
    userId
  ) => {
    const createApplyData = await this.Model.create({
      laundryName,
      laundryContent,
      laundryAddress,
      laundryImg,
      requests,
      userId,
    });

    return createApplyData;
  };
}

module.exports = LaundryRepository;
profile
개발자 꿈나무

0개의 댓글