controllers/personality-info-controller.js

/**
 * @module
 * @name personality-info
 *  */

// Import required modules
const Validator = require("fastest-validator");
const model = require("../models");
const {
  RESPONSE_500,
  PERSONALITY_INFO_CREATE_SUCCESS,
  RESPONSE_400,
  PERSONALITY_INFO_NOT_FOUND,
  PERSONALITY_INFO_UPDATE_FAILURE,
  RESPONSE_404,
  PERSONALITY_INFO_DELETE_SUCCESS,
  PERSONALITY_INFO_CREATE_FAILURE_ALREADY_EXIST,
} = require("../constants/constants");
const PersonalityInfo = model.PersonalityInfo;
const v = new Validator();

// Define schema for personality information
const schema = {
  name: "string|min:3|max:255",
  name_jp: "string|min:3|max:255|optional",
  nickname: "string|min:3|max:255|optional",
  birthdate: "string",
  birthplace: "string|optional",
  bloodtype: {
    type: "string",
    items: "string",
    enum: ["A", "B", "AB", "O"],
    optional: true,
  },
  description: "string|optional",
  source: "string|optional",
  image: "string|optional",
};

/**
 * @function
 * @memberof module:personality-info
 * @summary A function to add new personality information.
 * @name create
 * @param {String} name - Personality's full name.
 * @param {String=} name_jp - Personality's name in Japanese.
 * @param {String=} nickname - Personality's nickname.
 * @param {String=} birthdate - Personality's birthdate.
 * @param {String=} birthplace - Personality's birthplace.
 * @param {String=} bloodtype - Personality's bloodtype.
 * @param {String=} description - Personality's description.
 * @param {String=} source - A link source to personality information.
 * @param {String=} image - Personality's image.
 * @returns {JSON} An object that contains both an error message and a successful about personality information.
 * */
exports.create = async (req, res) => {
  try {
    // Validate request body
    const validate = v.validate(req.body, schema);
    // Check for validation errors
    if (validate.length) {
      // Return error response
      return res.status(400).json({
        error: RESPONSE_400,
        message: validate,
      });
    }
    // Check if there's already a record with same name
    const checkData = await PersonalityInfo.findOne({
      where: { name: req.body.name },
    });
    // If there's already a record with same name
    if (checkData != null) {
      return res.status(400).json({
        error: RESPONSE_400,
        message: PERSONALITY_INFO_CREATE_FAILURE_ALREADY_EXIST,
      });
    }
    // Create new personality info
    const personalityinfo = await PersonalityInfo.create(req.body);
    // Return success response
    return res.status(200).json({
      message: PERSONALITY_INFO_CREATE_SUCCESS,
      data: personalityinfo,
    });
  } catch (error) {
    // Handle errors
    return res.status(500).json({
      error: RESPONSE_500,
      message: error.message,
    });
  }
};

/**
 * @function
 * @memberof module:personality-info
 * @summary A function to update the personality information.
 * @name update
 * @param {String=} name - Personality's full name.
 * @param {String=} name_jp - Personality's name in Japanese.
 * @param {String=} nickname - Personality's nickname.
 * @param {String=} birthdate - Personality's birthdate.
 * @param {String=} birthplace - Personality's birthplace.
 * @param {String=} bloodtype - Personality's bloodtype.
 * @param {String=} description - Personality's description.
 * @param {String=} source - A link source to personality information.
 * @param {String=} image - Personality's image.
 * @returns {JSON} An object that contains both an error message and a successful about personality information.
 * */
exports.update = async (req, res) => {
  try {
    // Validate request body
    const validate = v.validate(req.body, schema);
    // Check if personality info exists
    if (!personalityinfo) {
      return res.status(400).json({
        error: RESPONSE_400,
        message: PERSONALITY_INFO_NOT_FOUND,
      });
    }
    const id = req.params.id;
    // Get personality info by ID
    let personalityinfo = await PersonalityInfo.findByPk(id);
    // Validate request data
    if (validate.length) {
      return res.status(400).json({
        error: RESPONSE_400,
        message: validate,
      });
    }
    // Update personality info
    personalityinfo = await personalityinfo.update(req.body);
    // Return success response
    return res.status(200).json({
      message: PERSONALITY_INFO_UPDATE_FAILURE,
      data: personalityinfo,
    });
  } catch (error) {
    // Handle errors
    return res.status(500).json({
      error: RESPONSE_500,
      message: error.message,
    });
  }
};

/**
 * @function
 * @memberof module:personality-info
 * @summary A function to get all of personality information stored in database.
 * @name getAll
 * @returns {JSON} An object that contains personality information.
 * */
exports.getAll = async (req, res) => {
  try {
    // Find all personality info
    const personalityinfo = await PersonalityInfo.findAll();
    // If no personality info found
    if (personalityinfo.length === 0) {
      // Return not found error
      return res.status(404).json({
        error: RESPONSE_404,
        message: PERSONALITY_INFO_NOT_FOUND,
      });
    }
    // Return personality info
    return res.status(200).json(personalityinfo);
  } catch (error) {
    // Handle errors
    return res.status(500).json({
      error: RESPONSE_500,
      message: error.message,
    });
  }
};

/**
 * @function
 * @memberof module:personality-info
 * @summary A function to get a specific personality information stored in database by it's ID.
 * @name get
 * @param {String} id - UUIDv4 which is represents an ID of personality information.
 * @returns {JSON} An object that contains a specific personality information.
 * */
exports.get = async (req, res) => {
  try {
    // Get the ID from params
    const id = req.params.id;
    // Find personality info by ID
    const personalityinfo = await PersonalityInfo.findByPk(id);
    // If no personality info found
    if (!personalityinfo) {
      // Return not found error
      return res.status(404).json({
        error: RESPONSE_404,
        message: PERSONALITY_INFO_NOT_FOUND,
      });
    }
    // Return personality info
    return res.status(200).json(personalityinfo);
  } catch (error) {
    // Handle error
    return res.status(500).json({
      error: RESPONSE_500,
      message: error.message,
    });
  }
};

/**
 * @function
 * @memberof module:personality-info
 * @summary A function to delete a specific personality information stored in database by it's ID.
 * @name delete
 * @param {String} id - UUIDv4 which is represents an ID of personality information.
 * @returns {JSON} An object that contains a message about personality information deletion.
 * */
exports.delete = async (req, res) => {
  try {
    // Get the ID from params
    const id = req.params.id;
    // Find personality info by ID
    const personalityinfo = await PersonalityInfo.findByPk(id);
    // If no personality info found
    if (!personalityinfo) {
      // Return not found error
      return res.status(404).json({
        error: RESPONSE_404,
        message: PERSONALITY_INFO_NOT_FOUND,
      });
    }
    // Delete the personality information
    await personalityinfo.destroy();
    // Return success message
    return res.status(200).json({
      message: PERSONALITY_INFO_DELETE_SUCCESS,
    });
  } catch (error) {
    // Handle error
    return res.status(500).json({
      error: RESPONSE_500,
      message: error.message,
    });
  }
};