.env
JWT_SECRET_KEY=secret
JWT_EXPIRES=5m
BCRYPT_SALT_ROUNDS=12
SERVER_PORT=8000
config.js
import dotenv from "dotenv";
dotenv.config();
export const config = {
jwtSecretKey: process.env.JWT_SECRET_KEY,
jwtExpires: process.env.JWT_EXPIRES,
bcryptSaltRounds: parseInt(process.env.BCRYPT_SALT_ROUNDS),
port: parseInt(process.env.SERVER_PORT),
};
database.js
import { Sequelize } from "sequelize";
const sequelize = new Sequelize("twitter", "root", "0000", {
host: "127.0.0.1",
dialect: "mysql",
});
export default sequelize;
app.js
import express from "express";
import helmet from "helmet";
import morgan from "morgan";
import cors from "cors";
import tweetController from "./tweet/tweet.controller.js";
import authController from "./auth/auth.controller.js";
import { config } from "../config.js";
import sequelize from "../database.js";
const app = express();
app.use(express.json());
app.use(morgan("dev"));
app.use(helmet());
app.use(cors());
app.use("/tweet", tweetController);
app.use("/auth", authController);
app.use((req, res, next) => {
res.sendStatus(404);
});
app.use((err, req, res, next) => {
res.sendStatus(500);
});
sequelize.sync().then(() => {
app.listen(config.port, () => {
console.log("Server On...");
});
});
user.repository.js
import { DataTypes } from "sequelize";
import sequelize from "../../database.js";
export const User = sequelize.define("user", {
id: {
type: DataTypes.BIGINT,
autoIncrement: true,
allowNull: false,
primaryKey: true,
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
},
username: {
type: DataTypes.STRING(100),
allowNull: false,
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
email: {
type: DataTypes.STRING(100),
allowNull: false,
},
});
export const findByUsername = async (username) => {
return User.findOne({
where: {
username,
},
}).then((data) => data.dataValues);
};
export const findById = async (id) => {
return User.findByPk(id);
};
export const createUser = async (user) => {
return User.create(user).then((data) => data.dataValues.id);
};
import sequelize from "../../database.js";
import * as userRepository from "../user/user.repository.js";
import { DataTypes } from "sequelize";
export const Tweet = sequelize.define("tweet", {
id: {
type: DataTypes.BIGINT,
autoIncrement: true,
allowNull: false,
primaryKey: true,
},
text: {
type: DataTypes.TEXT,
allowNull: false,
},
});
Tweet.belongsTo(userRepository.User);
export const getAllTweets = async () => {
return Tweet.findAll({
attributes: ["id", "text", "createdAt"],
include: {
model: userRepository.User,
attributes: ["id", "username"],
},
order: [["createdAt", "DESC"]],
});
};
export const getAllTweetsByUsername = async (username) => {
return Tweet.findAll({
attributes: ["id", "text", "createdAt"],
include: {
model: userRepository.User,
attributes: ["id", "username"],
where: {
username,
},
},
order: [["createdAt", "DESC"]],
});
};
export const getTweetById = async (id) => {
return Tweet.findOne({
attributes: ["id", "text", "createdAt"],
include: {
model: userRepository.User,
attributes: ["id", "username"],
},
where: {
id,
},
}).then((data) => data.dataValues);
};
export const createTweet = async (text, userId) => {
return Tweet.create({ text, userId }).then((data) => data.dataValues);
};
export const updateTweet = async (id, text) => {
Tweet.update(
{
text,
},
{
where: {
id,
},
}
);
};
export const deleteTweet = async (id) => {
Tweet.destroy({
where: {
id,
},
});
};
![](https://velog.velcdn.com/images/fkstndnjs/post/ab4df188-b400-4219-b413-395322d5a856/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/69390d18-a14c-4b29-adf8-cad5862352a5/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/1705eba6-79f5-4e94-bc88-3fb4398d38e8/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/5ff89d2b-fb8c-4cb0-b999-f57080a84b1e/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/ef469542-5a64-457d-8dcf-231e82b7823d/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/02f22a90-dbad-4153-8e21-9a66ba45d6dd/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/04ffbb17-183f-47f7-84e3-dd66d69c39ba/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/5a81b847-562c-47ba-a52e-14085222296e/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/d79a19d2-f22d-43ae-bd05-b77cf85ca4e4/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/7a273b02-2940-4685-80b7-a681b1f618cb/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/f3d1fb59-43eb-4c4a-a2f4-8b9797566dd7/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/00f94f4d-d63c-4435-a4a7-d67bb5f72019/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/88232c99-9fe1-4264-a3cf-2481f0849c34/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/00fe734d-c89d-45f7-90f4-31adf4c33bde/image.png)
![](https://velog.velcdn.com/images/fkstndnjs/post/6e492617-a8f0-4a66-bc8f-e09865be3e00/image.png)