Commit 917c3848 authored by Phạm Quang Bảo's avatar Phạm Quang Bảo

feat(challenge_1): design database and gen model

parents
node_modules/
.env
dist/
build/
*.log
\ No newline at end of file
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('classes', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
name: {
type: DataTypes.TEXT,
allowNull: true
},
description: {
type: DataTypes.TEXT,
allowNull: true
},
created_by: {
type: DataTypes.UUID,
allowNull: true
},
updated_by: {
type: DataTypes.UUID,
allowNull: true
},
course_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: 'courses',
key: 'id'
}
},
status: {
type: DataTypes.STRING(50),
allowNull: true
}
}, {
sequelize,
tableName: 'classes',
schema: 'public',
timestamps: true,
indexes: [
{
name: "classes_pkey",
unique: true,
fields: [
{ name: "id" },
]
},
]
});
};
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('courses', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
name: {
type: DataTypes.TEXT,
allowNull: true
},
description: {
type: DataTypes.TEXT,
allowNull: true
},
created_by: {
type: DataTypes.UUID,
allowNull: true
},
status: {
type: DataTypes.STRING(50),
allowNull: true
}
}, {
sequelize,
tableName: 'courses',
schema: 'public',
timestamps: true,
indexes: [
{
name: "courses_pkey",
unique: true,
fields: [
{ name: "id" },
]
},
]
});
};
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('enrollments', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
user_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: 'users',
key: 'id'
}
},
class_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: 'classes',
key: 'id'
}
},
status: {
type: DataTypes.STRING(50),
allowNull: true
}
}, {
sequelize,
tableName: 'enrollments',
schema: 'public',
timestamps: true
});
};
var DataTypes = require("sequelize").DataTypes;
var _classes = require("./classes");
var _courses = require("./courses");
var _enrollments = require("./enrollments");
var _roles = require("./roles");
var _user_auth = require("./user_auth");
var _users = require("./users");
function initModels(sequelize) {
var classes = _classes(sequelize, DataTypes);
var courses = _courses(sequelize, DataTypes);
var enrollments = _enrollments(sequelize, DataTypes);
var roles = _roles(sequelize, DataTypes);
var user_auth = _user_auth(sequelize, DataTypes);
var users = _users(sequelize, DataTypes);
enrollments.belongsTo(classes, { as: "class", foreignKey: "class_id"});
classes.hasMany(enrollments, { as: "enrollments", foreignKey: "class_id"});
classes.belongsTo(courses, { as: "course", foreignKey: "course_id"});
courses.hasMany(classes, { as: "classes", foreignKey: "course_id"});
users.belongsTo(roles, { as: "role", foreignKey: "role_id"});
roles.hasMany(users, { as: "users", foreignKey: "role_id"});
enrollments.belongsTo(users, { as: "user", foreignKey: "user_id"});
users.hasMany(enrollments, { as: "enrollments", foreignKey: "user_id"});
user_auth.belongsTo(users, { as: "user", foreignKey: "user_id"});
users.hasMany(user_auth, { as: "user_auths", foreignKey: "user_id"});
return {
classes,
courses,
enrollments,
roles,
user_auth,
users,
};
}
module.exports = initModels;
module.exports.initModels = initModels;
module.exports.default = initModels;
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('roles', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
name: {
type: DataTypes.TEXT,
allowNull: false
},
description: {
type: DataTypes.TEXT,
allowNull: true
},
created_by: {
type: DataTypes.UUID,
allowNull: true
}
}, {
sequelize,
tableName: 'roles',
schema: 'public',
timestamps: true,
indexes: [
{
name: "roles_pkey",
unique: true,
fields: [
{ name: "id" },
]
},
]
});
};
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('user_auth', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
user_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: 'users',
key: 'id'
}
},
password_hash: {
type: DataTypes.TEXT,
allowNull: true
}
}, {
sequelize,
tableName: 'user_auth',
schema: 'public',
timestamps: true,
indexes: [
{
name: "user_auth_pkey",
unique: true,
fields: [
{ name: "id" },
]
},
]
});
};
const Sequelize = require('sequelize');
module.exports = function(sequelize, DataTypes) {
return sequelize.define('users', {
id: {
type: DataTypes.UUID,
allowNull: false,
defaultValue: DataTypes.UUIDV4,
primaryKey: true
},
name: {
type: DataTypes.TEXT,
allowNull: false
},
date_of_birth: {
type: DataTypes.DATE,
allowNull: true
},
phone: {
type: DataTypes.TEXT,
allowNull: true
},
email: {
type: DataTypes.STRING(255),
allowNull: true
},
address: {
type: DataTypes.TEXT,
allowNull: true
},
role_id: {
type: DataTypes.UUID,
allowNull: true,
references: {
model: 'roles',
key: 'id'
}
}
}, {
sequelize,
tableName: 'users',
schema: 'public',
timestamps: true,
indexes: [
{
name: "users_pkey",
unique: true,
fields: [
{ name: "id" },
]
},
]
});
};
This diff is collapsed.
{
"name": "code",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "commonjs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"express": "^5.2.1",
"pg": "^8.20.0",
"pg-hstore": "^2.3.4",
"sequelize": "^6.37.8",
"sequelize-auto": "^0.8.8"
}
}
version: '3.5'
services:
app:
container_name: db-challenge
image: postgres:17
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
POSTGRES_DB: challenge_db
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "2550:5432"
volumes:
postgres_data:
\ No newline at end of file
This diff is collapsed.
erd.png

132 KB

CREATE TABLE classes (
id uuid DEFAULT gen_random_uuid() NOT NULL,
name text,
description text,
created_at timestamp with time zone DEFAULT now(),
created_by uuid,
updated_at timestamp with time zone,
updated_by uuid,
course_id uuid,
status character varying(50)
);
CREATE TABLE courses (
id uuid DEFAULT gen_random_uuid() NOT NULL,
name text,
description text,
created_at timestamp with time zone DEFAULT now(),
created_by uuid,
status character varying(50)
);
CREATE TABLE enrollments (
id uuid DEFAULT gen_random_uuid() NOT NULL,
user_id uuid,
class_id uuid,
created_at timestamp with time zone DEFAULT now(),
status character varying(50)
);
CREATE TABLE roles (
id uuid DEFAULT gen_random_uuid() NOT NULL,
name text NOT NULL,
description text,
created_at timestamp with time zone DEFAULT now(),
created_by uuid
);
CREATE TABLE user_auth (
id uuid DEFAULT gen_random_uuid() NOT NULL,
user_id uuid,
password_hash text,
created_at timestamp with time zone DEFAULT now()
);
CREATE TABLE users (
id uuid DEFAULT gen_random_uuid() NOT NULL,
name text NOT NULL,
date_of_birth timestamp without time zone,
phone text,
email character varying(255),
address text,
created_at timestamp with time zone DEFAULT now(),
role_id uuid
);
ALTER TABLE classes
ADD CONSTRAINT classes_pkey
PRIMARY KEY (id);
ALTER TABLE courses
ADD CONSTRAINT courses_pkey
PRIMARY KEY (id);
ALTER TABLE roles
ADD CONSTRAINT roles_pkey
PRIMARY KEY (id);
ALTER TABLE user_auth
ADD CONSTRAINT user_auth_pkey
PRIMARY KEY (id);
ALTER TABLE users
ADD CONSTRAINT users_pkey
PRIMARY KEY (id);
ALTER TABLE enrollments
ADD CONSTRAINT enrollment_user
FOREIGN KEY (user_id)
REFERENCES users(id);
ALTER TABLE classes
ADD CONSTRAINT fk_classes_course
FOREIGN KEY (course_id)
REFERENCES courses(id);
ALTER TABLE enrollments
ADD CONSTRAINT fk_enrollment_class
FOREIGN KEY (class_id)
REFERENCES classes(id);
ALTER TABLE user_auth
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id)
REFERENCES users(id);
ALTER TABLE users
ADD CONSTRAINT users_role
FOREIGN KEY (role_id)
REFERENCES roles(id);
\ No newline at end of file
-- 1. Thêm 10 Role mẫu (Cần có Role trước để gán cho User)
INSERT INTO roles (id, name, description, created_at)
SELECT
gen_random_uuid(),
'Role Name ' || i,
'Description for role ' || i,
NOW()
FROM generate_series(1, 10) AS i;
-- 2. Thêm 10 User mẫu (Lấy ngẫu nhiên role_id từ bảng roles)
INSERT INTO users (id, name, date_of_birth, phone, email, address, role_id, created_at)
SELECT
gen_random_uuid(),
'User Name ' || i,
'1990-01-01'::timestamptz + (i || ' months')::interval,
'090123456' || (i-1),
'user' || i || '@example.com',
'Address ' || i,
(SELECT id FROM roles ORDER BY random() LIMIT 1), -- Lấy ngẫu nhiên 1 role
NOW()
FROM generate_series(1, 10) AS i;
-- 3. Thêm 10 Auth mẫu (Liên kết 1-1 hoặc 1-n với Users)
INSERT INTO user_auth (id, user_id, password_hash, created_at)
SELECT
gen_random_uuid(),
u.id,
'hash_password_sample_' || row_number() OVER (),
NOW()
FROM (SELECT id FROM users LIMIT 10) u;
-- 4. Thêm 10 Course mẫu
INSERT INTO courses (id, name, description, status, created_at)
SELECT
gen_random_uuid(),
'Course ' || i,
'Description for course ' || i,
'active',
NOW()
FROM generate_series(1, 10) AS i;
-- 5. Thêm 10 Class mẫu (Liên kết với Courses)
INSERT INTO classes (id, name, description, course_id, status, created_at)
SELECT
gen_random_uuid(),
'Class ' || i,
'Description for class ' || i,
(SELECT id FROM courses ORDER BY random() LIMIT 1),
'opened',
NOW()
FROM generate_series(1, 10) AS i;
-- 6. Thêm 10 Enrollment mẫu (Kết nối User và Class)
INSERT INTO enrollments (id, user_id, class_id, created_at)
SELECT
gen_random_uuid(),
(SELECT id FROM users ORDER BY random() LIMIT 1),
(SELECT id FROM classes ORDER BY random() LIMIT 1),
NOW()
FROM generate_series(1, 10) AS i;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment