Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/src/i.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

35 changes: 35 additions & 0 deletions .github/workflows/src/message.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { EventEmitter } from 'events';
import { messageService } from '../services/message.service.js';

export const messageEmitter = new EventEmitter();

const create = async (req, res) => {
const { roomId } = req.params;
const { text, userId } = req.body;

if (!roomId || !userId || !text) {
return res.sendStatus(404);
}

const newMessage = await messageService.createMessageInRoom(
text,
userId,
roomId,
);

messageEmitter.emit('message', newMessage);

res.status(201).json(newMessage);
};

export const getMessages = async (req, res) => {
const { roomId } = req.params;
const messages = await messageService.getAllMessagesInRoom(roomId);

res.status(200).json(messages);
};

export const messageController = {
create,
getMessages,
};
31 changes: 31 additions & 0 deletions .github/workflows/src/models/message.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { DataTypes } from 'sequelize';
import { client } from '../db.js';
import { User } from './user.js';
import { Room } from './room.js';

export const Message = client.define(
'message',
{
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true,
},
text: {
type: DataTypes.STRING,
allowNull: false,
},
createdAt: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
allowNull: false,
},
},
{ updatedAt: false },
);

Message.belongsTo(User);
User.hasMany(Message);
Message.belongsTo(Room);
Room.hasMany(Message);
23 changes: 23 additions & 0 deletions .github/workflows/src/models/room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { DataTypes } from 'sequelize';
import { client } from '../db.js';
import { User } from './user.js';

export const Room = client.define('room', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.STRING,
allowNull: false,
},
});

Room.belongsTo(User);
User.hasMany(Room);
16 changes: 16 additions & 0 deletions .github/workflows/src/models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { DataTypes } from 'sequelize';
import { client } from '../db.js';

export const User = client.define('user', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
allowNull: false,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
unique: true,
allowNull: false,
},
});
51 changes: 51 additions & 0 deletions .github/workflows/src/rooms.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { roomsService } from '../services/rooms.service.js';

const getAllRooms = async (req, res) => {
const rooms = await roomsService.getAllRooms();

res.status(200).send(rooms);
};

const createRoom = async (req, res) => {
const { title, userId, description } = req.body;

if (!title || !userId) {
return res.sendStatus(404);
}

await roomsService.createRoom(title, userId, description);

res.sendStatus(201);
};

const updateRoom = async (req, res) => {
const { roomId } = req.params;
const { title, description } = req.body;

if ((!title && !description) || !roomId) {
return res.sendStatus(404);
}

await roomsService.updateRoom(roomId, title, description);

res.sendStatus(204);
};

const deleteRoom = async (req, res) => {
const { roomId } = req.params;

if (!roomId) {
return res.sendStatus(400);
}

await roomsService.deleteRoom(roomId);

res.sendStatus(204);
};

export const roomController = {
getAllRooms,
createRoom,
updateRoom,
deleteRoom,
};
7 changes: 7 additions & 0 deletions .github/workflows/src/routes/message.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import express from 'express';
import { messageController } from '../controllers/message.controller.js';

export const messageRoute = new express.Router();

messageRoute.get('/rooms/:roomId/messages', messageController.getMessages);
messageRoute.post('/rooms/:roomId/messages', messageController.create);
9 changes: 9 additions & 0 deletions .github/workflows/src/routes/rooms.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import express from 'express';
import { roomController } from '../controllers/rooms.controller.js';

export const roomsRoute = new express.Router();

roomsRoute.get('/', roomController.getAllRooms);
roomsRoute.post('/', roomController.createRoom);
roomsRoute.patch('/:roomId', roomController.updateRoom);
roomsRoute.delete('/:roomId', roomController.deleteRoom);
6 changes: 6 additions & 0 deletions .github/workflows/src/routes/user.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import express from 'express';
import { userController } from '../controllers/user.controller.js';

export const userRoute = new express.Router();

userRoute.post('/', userController.create);
14 changes: 14 additions & 0 deletions .github/workflows/src/services/message.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Message } from '../models/message.js';

const getAllMessagesInRoom = (roomId) => {
return Message.findAll({ where: { roomId } });
};

const createMessageInRoom = (text, userId, roomId) => {
return Message.create({ text, userId, roomId });
};

export const messageService = {
getAllMessagesInRoom,
createMessageInRoom,
};
42 changes: 42 additions & 0 deletions .github/workflows/src/services/rooms.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { Room } from '../models/room.js';

const getAllRooms = () => {
return Room.findAll();
};

const createRoom = (title, userId, description = '') => {
return Room.create({ title, userId, description });
};

const deleteRoom = (id) => {
return Room.destroy({ where: { id } });
};

const updateRoom = (id, title, description) => {
if (!id) {
throw new Error('Room id is required');
}

const updatedData = {};

if (title) {
updatedData.title = title;
}

if (description) {
updatedData.description = description;
}

if (Object.keys(updatedData).length === 0) {
throw new Error('At least one field must be provided');
}

return Room.update(updatedData, { where: { id } });
};

export const roomsService = {
getAllRooms,
createRoom,
deleteRoom,
updateRoom,
};
9 changes: 9 additions & 0 deletions .github/workflows/src/services/user.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { User } from '../models/user.js';

const createUser = async (name) => {
return User.create({ name });
};

export const userService = {
createUser,
};
23 changes: 23 additions & 0 deletions .github/workflows/src/user.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { User } from '../models/user.js';
import { userService } from '../services/user.service.js';

const create = async (req, res) => {
const { name } = req.body;
const isNameExist = await User.findOne({ where: { name } });

if (!name) {
return res.sendStatus(404);
}

if (isNameExist) {
return res.status(409).json({ message: 'User already exists' });
}

await userService.createUser(name);

return res.status(201).json({ message: 'User was created!' });
};

export const userController = {
create,
};
1 change: 0 additions & 1 deletion src/index.js

This file was deleted.

Loading