이제 사용자 인증, 사용량 제한 등의 기능을 추가하여 web API server 로 만든다.
(API server 를 하나 더 추가하는 것이 일반적이지만, 중복된 코드를 많이 사용함으로 기존 코드를 수정하되, 모두 하드코딩을 하는 방식을 선택했다.)
우선 views 폴더에 error.html 파일을 생성한다.
<h1>{{message}}</h1>
<h2>{{error.status}}</h2>
<pre>{{error.stack}}</pre>
const Sequelize = require("sequelize");
module.exports = class Domain extends Sequelize.Model {
static init(sequelize) {
return super.init({
host: {
type: Sequelize.STRING(80),
allowNull: false,
},
type: {
type: Sequelize.ENUM('free', 'premium'),
allowNull: false,
},
clientSecret: {
type: Sequelize.UUID,
allowNull: false,
},
}, {
sequelize,
timestamps: true,
paranoid: true,
modelName: 'Domain',
tableName: 'domains',
});
}
static associate(db) {
db.Domain.belongsTo(db.User);
}
}
Domain 모델에는 host, type, clientSecret 이 들어간다.
type 의 enum 속성은 넣을 수 있는 값을 제한하는 데이터 타입이다.
clientSecret 은 다른 사용자가 API 를 사용할 때 필요한 비밀키이다.
type 의 UUID 는 충돌 가능성이 매우 적은 랜덤한 문자열을 의미한다.
이제 새로 생성한 Domain 모델을 시퀄라이즈와 연결한다.
models 폴더의 index.js 를 아래와 같이 수정한다.
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require("../config/config")[env];
const User = require("./user");
const Post = require("./post");
const Hashtag = require("./hashtag");
**const Domain = require("./domain");**
const db = {};
const sequelize = new Sequelize(
config.database, config.username, config.password, config,
);
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;
**db.Domain = Domain;**
User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);
**Domain.init(sequelize);**
User.associate(db);
Post.associate(db);
Hashtag.associate(db);
**Domain.associate(db);**
module.exports = db;
...
static associate(db) {
db.User.hasMany(db.Post);
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: "Followings",
through: 'Follow',
});
**db.User.hasMany(db.Domain);**
}
};