-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.js
More file actions
170 lines (153 loc) · 5.17 KB
/
models.js
File metadata and controls
170 lines (153 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// Modelos ORM
var Sequelize = require('sequelize');
// Para usar MySQL:
// var sequelize = new Sequelize('blog', 'core', 'core');
// Para usar SQLite:
// var sequelize = new Sequelize(null, null, null,
// {dialect: "sqlite",
// storage: "blog.sqlite"});
// Usar BBDD definida en variables de entorno:
var sequelize = new Sequelize(process.env.DATABASE_NAME,
process.env.DATABASE_USER,
process.env.DATABASE_PASSWORD,
{ dialect: process.env.DATABASE_DIALECT,
protocol: process.env.DATABASE_PROTOCOL,
port: process.env.DATABASE_PORT,
host: process.env.DATABASE_HOST,
storage: process.env.DATABASE_STORAGE,
omitNull: true});
// Campos de los posts.
var Post = sequelize.define('Post',
{ authorId: {
type: Sequelize.INTEGER,
validate: {
notEmpty: {msg: "El campo autor no puede estar vacio"}}
},
title: {
type: Sequelize.STRING,
validate: {
notEmpty: {msg: "El campo del titulo no puede estar vacio"}}
},
body: {
type: Sequelize.TEXT,
validate: {
notEmpty: {msg: "El cuerpo del post no puede estar vacio"}}
}
});
// Campos de los Usuarios.
var User = sequelize.define(
'User',
{
login: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo login no puede estar vacio" }
}
},
name: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo nombre no puede estar vacio" }
}
},
email: {
type: Sequelize.TEXT,
validate: {
isEmail: { msg: "El formato del email introducido no es correcto" },
notEmpty: { msg: "El campo email no puede estar vacio" }
}
},
hashed_password: {
type: Sequelize.STRING
},
salt: {
type: Sequelize.STRING
}
});
// Campos de los Comentarios.
var Comment = sequelize.define(
'Comment',
{
authorId: {
type: Sequelize.INTEGER,
validate: {
notEmpty: { msg: "El campo authorId no puede estar vacío" }
}
},
postId: {
type: Sequelize.INTEGER,
validate: {
notEmpty: { msg: "El campo postId no puede estar vacío" }
}
},
body: {
type: Sequelize.TEXT,
validate: {
notEmpty: { msg: "El cuerpo del comentario no puede estar vacío" }
}
}
});
// Campos de los Adjuntos.
var Attachment = sequelize.define(
'Attachment',
{
postId: {
type: Sequelize.INTEGER,
validate: {
notEmpty: { msg: "El campo postId no puede estar vacío" }
}
},
public_id: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo public_id no puede estar vacío" }
}
},
url: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo url no puede estar vacío" }
}
},
filename: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo filename no puede estar vacío" }
}
},
mime: {
type: Sequelize.STRING,
validate: {
notEmpty: { msg: "El campo mime no puede estar vacío" }
}
}
});
// Relaciones
// La llamada User.hasMany(Post);
// - crea un atributo llamado userId en el modelo de Post
// - y en el prototipo de User se crean los metodos getPosts, setPosts,
// addPost, removePost, hasPost y hasPosts.
//
// Como el atributo del modelo Post que apunta a User se llama authorId
// en vez de userId, he añadido una opcion que lo indica.
User.hasMany(Post, {foreignKey: 'authorId'});
User.hasMany(Comment, {foreignKey: 'authorId'});
Post.hasMany(Comment, {foreignKey: 'postId'});
Post.hasMany(Attachment, {foreignKey: 'postId'});
// La llamada Post.belongsTo(User);
// - crea en el modelo de Post un atributo llamado userId,
// - y en el prototipo de Post se crean los metodos getUser y setUser.
//
// Como el atributo del modelo Post que apunta a User se llama authorId
// en vez de userId, he añadido una opcion que lo indica. Asi la
// foreignkey del modelo Post es authorId, y los metodos creados son
// setAuthor y getAuthor.
Post.belongsTo(User, {as: 'Author', foreignKey: 'authorId'});
Comment.belongsTo(User, {as: 'Author', foreignKey: 'authorId'});
Comment.belongsTo(Post, {as: 'Post', foreignKey: 'postId'});
Attachment.belongsTo(Post, {as: 'Post', foreignKey: 'postId'});
// Exportar la clase creada:
exports.Post = Post;
exports.User = User;
exports.Comment = Comment;
exports.Attachment = Attachment;