Commit 52c6cc60 authored by Geovanny's avatar Geovanny

Refactored house routing

parent 3045fac3
......@@ -16,7 +16,7 @@ class MembershipManager(commands.Cog):
"""Send member request to house id"""
try:
session = await self.bot.getUserSession(ctx.message.author)
await Api.postSession('/house/request', {"house_id": house_id}, session)
await Api.postSession('/house/membership/request', {"house_id": house_id}, session)
await ctx.send('Request sent');
except ApiError as error:
await ctx.send(error.message)
......@@ -26,7 +26,7 @@ class MembershipManager(commands.Cog):
"""Cancel member request"""
try:
session = await self.bot.getUserSession(ctx.message.author)
await Api.deleteSession('/house/request', session)
await Api.deleteSession('/house/membership/request', session)
await ctx.send('Request cancelled');
except ApiError as error:
await ctx.send(error.message)
......@@ -36,7 +36,7 @@ class MembershipManager(commands.Cog):
"""All requests to house"""
try:
session = await self.bot.getUserSession(ctx.message.author)
data = await Api.getSession('/house/requests', session)
data = await Api.getSession('/house/membership/request/all', session)
if(len(data) == 0):
await ctx.send('No requests')
else:
......@@ -63,7 +63,7 @@ class MembershipManager(commands.Cog):
"""Accept membership request"""
try:
session = await self.bot.getUserSession(ctx.message.author)
data = await Api.postSession('/house/accept-request',{"user_id": user_id} , session)
data = await Api.postSession('/house/membership',{"user_id": user_id} , session)
await ctx.send('Membership accepted')
except ApiError as error:
......@@ -74,7 +74,7 @@ class MembershipManager(commands.Cog):
"""Refuse membership request"""
try:
session = await self.bot.getUserSession(ctx.message.author)
data = await Api.deleteSession('/house/reject-request/{0}'.format(user_id), session)
data = await Api.deleteSession('/house/membership/request/{0}'.format(user_id), session)
await ctx.send('Membership rejected')
except ApiError as error:
......
......@@ -18,7 +18,7 @@ class WarManager(commands.Cog):
async def currentWar(self, ctx):
"""Get current war information"""
try:
data = await Api.get('/house/current-war');
data = await Api.get('/house/war');
date = parser.parse(data.get('day'))
await ctx.send('Current War Date: {0}/{1}/{2}'.format(date.year, date.month, date.day))
except ApiError as error:
......@@ -27,7 +27,7 @@ class WarManager(commands.Cog):
async def warParticipation(self, ctx, decision):
try:
session = await self.bot.getUserSession(ctx.message.author)
await Api.postSession('/house/participation', {"decision": decision}, session)
await Api.postSession('/house/war/participation', {"decision": decision}, session)
await ctx.send('Participation updated')
except ApiError as error:
await ctx.send(error.message)
......
const db = require('../../database/database');
const model = {};
model.getMembers = async(house_id) => {
const sql_text = `SELECT u.id, u.username, u.leadership, hr.lk_name as house_role, hr.lk_key
FROM users as u
LEFT JOIN house_role_lk as hr ON hr.lk_key = u.lk_house_role
WHERE u.house_id = ?;`;
const data = await db.pool.query(sql_text, [house_id]);
return data;
}
model.getMemberUnits = async(member_id) => {
const sql_text = `SELECT u.*, uu.unit_level, uu.elite_flg
FROM users as us
LEFT JOIN users_units as uu ON us.id = uu.user_id
LEFT JOIN units as u ON uu.unit_id = u.id
WHERE us.id = ? ORDER BY u.name ASC;`
const data = await db.pool.query(sql_text, [member_id]);
return data;
}
module.exports = model;
\ No newline at end of file
const Router = require('@koa/router');
const router = new Router();
const memberModel = require('./model');
// DELETE
const HOUSE_ROLES = {
lg: 0,
sen: 1,
mar: 2,
nob: 3,
tre: 4,
kng: 5
}
function hasHouseNoThrow(context){
return context.user.house_id;
}
function checkPermissions(context, ROLE){
if(!hasHouseNoThrow(context) || ROLE < context.user.lk_permission_level){
context.throw(403, "No Permissions")
}
}
function hasHouse(context){
if(!context.user.house_id){
context.throw(400, 'No house');
}
}
// END DELETE
router.get('/all', async (context, next) => {
hasHouse(context);
try{
const data = await memberModel.getMembers(context.user.house_id);
context.response.status = 200;
context.response.body = data;
}catch(error){
console.log(error);
context.throw(400, "Failed to get members")
}
});
router.get('/:member_id/units', async (context, next) => {
checkPermissions(context, HOUSE_ROLES.sen);
try{
const data = await memberModel.getMemberUnits(context.params.member_id);
context.response.status = 200;
context.response.body = data;
}catch(error){
console.log(error);
context.throw('Failed to get Member Units');
}
});
module.exports = router;
\ No newline at end of file
const db = require('../../database/database');
const model = {};
async function checkHouseRequest(house_id, user_id){
const sql_exists = 'SELECT EXISTS(SELECT * FROM house_requests WHERE house_id = ? AND user_id = ?) as result;'
const exists = await db.pool.query(sql_exists, [house_id , user_id]);
if(exists[0] && exists[0].result===0){
throw Error("Membership request not send for user's house")
}
}
model.acceptRequest = async(user_id, house_id) => {
checkHouseRequest(house_id, user_id);
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?;';
const sql_text2 = 'UPDATE users SET house_id = ?, lk_house_role = \'kng\' WHERE id = ?;';
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text, [user_id]);
await con.query(sql_text2, [house_id, user_id]);
await con.query('COMMIT;');
await con.release();
}
model.changeHouseLiege = async(liege_id, member_id) => {
const sql_text = `UPDATE users SET lk_house_role = 'kng' WHERE id = ?;`;
const sql_text2 = `UPDATE users SET lk_house_role = 'lg' WHERE id = ?;`;
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;')
await con.query(sql_text, [liege_id]);
await con.query(sql_text2, [member_id]);
await con.query('COMMIT;');
await con.release();
}
model.modifyMemberRole = async(member_id, role) => {
const sql_text = 'UPDATE users SET lk_house_role = ? WHERE id = ?;';
await db.pool.query(sql_text, [role, member_id]);
}
// DELETE AFTER CHANGING MODEL
model.deleteHouse = async(house_id) => {
const sql_text = 'UPDATE users SET lk_house_role = NULL where house_id = ?';
const sql_text2 = 'DELETE FROM houses WHERE id = ?;';
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text, [house_id]);
await con.query(sql_text2, [house_id]);
await con.query('COMMIT;');
await con.release();
}
model.leaveHouse = async(user_id) => {
const sql_text = 'UPDATE users SET house_id = NULL, lk_house_role = NULL WHERE id = ?;';
await db.pool.query(sql_text, [user_id]);
}
model.deleteMember = async(user_id) => {
const sql_text = 'UPDATE users SET house_id = NULL, lk_house_role = NULL WHERE id = ? AND lk_house_role != \'lg\';';
await db.pool.query(sql_text, [user_id]);
}
module.exports = model;
\ No newline at end of file
const db = require('../../../database/database');
const model = {};
async function checkHouseRequest(house_id, user_id){
const sql_exists = 'SELECT EXISTS(SELECT * FROM house_requests WHERE house_id = ? AND user_id = ?) as result;'
const exists = await db.pool.query(sql_exists, [house_id , user_id]);
if(exists[0] && exists[0].result===0){
throw Error("Membership request not send for user's house")
}
}
model.getHouseRequests = async(house_id) => {
const sql_text = `SELECT u.id, u.username
FROM house_requests as hr
LEFT JOIN users as u ON u.id = hr.user_id
WHERE hr.house_id = ?;`
const data = await db.pool.query(sql_text, [house_id]);
return data;
}
model.sendRequest = async(house_id, user_id) => {
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?';
const sql_text2 = 'INSERT INTO house_requests (house_id, user_id) VALUES (?, ?)';
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text, [user_id]);
await con.query(sql_text2, [house_id, user_id]);
await con.query('COMMIT;');
await con.release();
};
model.cancelRequests = async(user_id) => {
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?';
await db.pool.query(sql_text, [user_id]);
}
model.rejectRequest = async(user_id, house_id) => {
checkHouseRequest(house_id, user_id);
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?;';
await db.pool.query(sql_text, [user_id]);
}
module.exports = model;
\ No newline at end of file
const Router = require('@koa/router');
const router = new Router();
const requestModel = require('./model');
// DELETE START
const HOUSE_ROLES = {
lg: 0,
sen: 1,
mar: 2,
nob: 3,
tre: 4,
kng: 5
}
function checkPermissions(context, ROLE){
if(!hasHouseNoThrow(context) || ROLE < context.user.lk_permission_level){
context.throw(403, "No Permissions")
}
}
function hasHouseNoThrow(context){
return context.user.house_id;
}
// DELETE END
router.get('/all', async (context, next) => {
checkPermissions(context, HOUSE_ROLES.sen);
try{
const data = await requestModel.getHouseRequests(context.user.house_id);
context.response.status = 200;
context.response.body = data;
}catch(error){
console.log(error);
context.throw(400, 'Unable to get requests');
}
});
router.post('/', async (context, next) => {
if(context.user.house_id){
context.throw(400, 'Already in a house')
}
try{
const body = context.request.body;
if(!body || !body.house_id){
throw Error('No house ID');
}
await requestModel.sendRequest(body.house_id, context.session.user_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Failed to send request');
}
});
router.delete('/', async (context, next) =>{
if(context.user.house_id){
context.throw(400, 'Already in a house')
}
try{
await requestModel.cancelRequests(context.session.user_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Failed to send request');
}
});
router.delete('/:user_id', async (context, next) => {
checkPermissions(context, HOUSE_ROLES.sen);
try{
const body = context.request.body;
if(!context.params.user_id){
throw Error("No user to refuse");
}
await requestModel.rejectRequest(context.params.user_id, context.user.house_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Unable to reject Request')
}
});
module.exports = router;
\ No newline at end of file
const Router = require('@koa/router');
const router = new Router();
const membershipModel = require('./model');
const userModel = require('../../user/model');
const requestRouter = require('./request/route');
router.use('/request', requestRouter.routes(), requestRouter.allowedMethods());
// DELETE START
const HOUSE_ROLES = {
lg: 0,
sen: 1,
mar: 2,
nob: 3,
tre: 4,
kng: 5
}
function checkPermissions(context, ROLE){
if(!hasHouseNoThrow(context) || ROLE < context.user.lk_permission_level){
context.throw(403, "No Permissions")
}
}
function hasHouseNoThrow(context){
return context.user.house_id;
}
function hasHouse(context){
if(!context.user.house_id){
context.throw(400, 'No house');
}
}
function checkPermissionsNoThrow(context, ROLE){
return ROLE >= context.user.lk_permission_level;
}
// DELETE END
router.get('/permissions', async (context, next) => {
if(!context.user.house_id || context.user.lk_permission_level === undefined){
context.throw(400, 'No house');
}
try{
context.response.status = 200;
context.response.body = context.user.lk_permission_level;
}catch(error){
console.log(error);
context.throw(400, 'ERROR');
}
});
router.post('/', async (context, next) => {
checkPermissions(context, HOUSE_ROLES.sen);
try{
const body = context.request.body;
if(!body || !body.user_id){
throw Error('No user to accept');
}
await membershipModel.acceptRequest(body.user_id, context.user.house_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Unable to Accept Request')
}
});
router.put('/:member_id', async(context, next) => {
hasHouse(context);
const body = context.request.body;
if(!body || !body.role){
context.throw(400, 'Missing parameters')
}
try{
const member = await userModel.getUserFullFromId(context.params.member_id);
if(!member){
throw Error('Member does not exists');
}
if(member.house_id !== context.user.house_id){
throw Error('Not on the same house');
}
if(member.lk_permission_level <= context.user.lk_permission_level){
throw Error('Member permission level is high')
}
if(checkPermissionsNoThrow(context, HOUSE_ROLES.lg)){
if(body.role === 'lg'){
await membershipModel.changeHouseLiege(context.user.id, member.id);
}else{
await membershipModel.modifyMemberRole(member.id, body.role);
}
}else{
if(context.user.lk_house_role < HOUSE_ROLES[body.role]){
await membershipModel.modifyMemberRole(member.id, body.role);
}else{
throw Error('Cannot modify to the same level');
}
}
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Failed to modify role')
}
});
router.delete('/', async (context, next) => {
if(context.user.lk_house_role==='lg'){
try{
await membershipModel.deleteHouse(context.user.house_id, context.session.user_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Unable to Delete House');
}
}else{
try{
await membershipModel.leaveHouse(context.session.user_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Unable to Leave');
}
}
});
router.delete('/:user_id', async (context, next) => {
checkPermissions(context, HOUSE_ROLES.sen);
if(context.params.user_id===context.session.user_id){
context.throw(400, "Can't delete yourself");
}
try{
const member = await userModel.getUserFullFromId(context.params.user_id);
if(!member){
throw Error('Member does not exists');
}
if(member.house_id !== context.user.house_id){
throw Error('Not on the same house');
}
if(member.lk_permission_level <= context.user.lk_permission_level){
throw Error("Member permission level is high")
}
await membershipModel.deleteMember(context.params.user_id);
context.response.status = 204;
}catch(error){
console.log(error);
context.throw(400, 'Unable to Delete Member')
}
});
module.exports = router;
\ No newline at end of file
......@@ -4,14 +4,6 @@ const model = {};
const h_columns = ['house_name', 'house_level', 'camp_location'];
async function checkHouseRequest(house_id, user_id){
const sql_exists = 'SELECT EXISTS(SELECT * FROM house_requests WHERE house_id = ? AND user_id = ?) as result;'
const exists = await db.pool.query(sql_exists, [house_id , user_id]);
if(exists[0] && exists[0].result===0){
throw Error("Membership request not send for user's house")
}
}
model.getAll = async () => {
const sql_text = `SELECT h.*, u.username as liege_username
FROM houses as h
......@@ -103,166 +95,4 @@ model.deleteHouse = async(house_id) => {
await con.release();
}
model.sendRequest = async(house_id, user_id) => {
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?';
const sql_text2 = 'INSERT INTO house_requests (house_id, user_id) VALUES (?, ?)';
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text, [user_id]);
await con.query(sql_text2, [house_id, user_id]);
await con.query('COMMIT;');
await con.release();
};
model.cancelRequests = async(user_id) => {
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?';
await db.pool.query(sql_text, [user_id]);
}
model.getHouseRequests = async(house_id) => {
const sql_text = `SELECT u.id, u.username
FROM house_requests as hr
LEFT JOIN users as u ON u.id = hr.user_id
WHERE hr.house_id = ?;`
const data = await db.pool.query(sql_text, [house_id]);
return data;
}
model.acceptRequest = async(user_id, house_id) => {
checkHouseRequest(house_id, user_id);
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?;';
const sql_text2 = 'UPDATE users SET house_id = ?, lk_house_role = \'kng\' WHERE id = ?;';
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text, [user_id]);
await con.query(sql_text2, [house_id, user_id]);
await con.query('COMMIT;');
await con.release();
}
model.rejectRequest = async(user_id, house_id) => {
checkHouseRequest(house_id, user_id);
const sql_text = 'DELETE FROM house_requests WHERE user_id = ?;';
await db.pool.query(sql_text, [user_id]);
}
model.deleteMember = async(user_id) => {
const sql_text = 'UPDATE users SET house_id = NULL, lk_house_role = NULL WHERE id = ? AND lk_house_role != \'lg\';';
await db.pool.query(sql_text, [user_id]);
}
model.leaveHouse = async(user_id) => {
const sql_text = 'UPDATE users SET house_id = NULL, lk_house_role = NULL WHERE id = ?;';
await db.pool.query(sql_text, [user_id]);
}
model.getMembers = async(house_id) => {
const sql_text = `SELECT u.id, u.username, u.leadership, hr.lk_name as house_role, hr.lk_key
FROM users as u
LEFT JOIN house_role_lk as hr ON hr.lk_key = u.lk_house_role
WHERE u.house_id = ?;`;
const data = await db.pool.query(sql_text, [house_id]);
return data;
}
model.modifyMemberRole = async(member_id, role) => {
const sql_text = 'UPDATE users SET lk_house_role = ? WHERE id = ?;';
await db.pool.query(sql_text, [role, member_id]);
}
model.changeHouseLiege = async(liege_id, member_id) => {
const sql_text = `UPDATE users SET lk_house_role = 'kng' WHERE id = ?;`;
const sql_text2 = `UPDATE users SET lk_house_role = 'lg' WHERE id = ?;`;
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;')
await con.query(sql_text, [liege_id]);
await con.query(sql_text2, [member_id]);
await con.query('COMMIT;');
await con.release();
}
model.getMemberUnits = async(member_id) => {
const sql_text = `SELECT u.*, uu.unit_level, uu.elite_flg
FROM users as us
LEFT JOIN users_units as uu ON us.id = uu.user_id
LEFT JOIN units as u ON uu.unit_id = u.id
WHERE us.id = ? ORDER BY u.name ASC;`
const data = await db.pool.query(sql_text, [member_id]);
return data;
}
model.getCurrentWar = async() => {
const sql_text = 'SELECT * FROM war_days WHERE completed = 0 LIMIT 1;'
const data = await db.pool.query(sql_text);
return data[0];
}
model.insertNewWar = async() => {
const sql_text = 'UPDATE war_days SET completed = 1;';
const sql_text2 = 'INSERT INTO war_days (day) VALUES (CURDATE());'
let con = await db.pool.getConnection()
await con.query('START TRANSACTION;');
await con.query(sql_text);
await con.query(sql_text2);
await con.query('COMMIT;');
await con.release();
}
model.warParticipation = async (user_id, house_id, decision) => {
const sql_text = 'SELECT @current_war_id:=id FROM war_days WHERE completed = 0 LIMIT 1;';
const sql_text2 = `INSERT INTO users_war (user_id, war_id, house_id, decision) VALUES (?, @current_war_id, ?, ?)
ON DUPLICATE KEY UPDATE decision = ?`;
let con = await db.pool.getConnection();
await con.query('START TRANSACTION;');
await con.query(sql_text);
await con.query(sql_text2, [user_id, house_id, decision, decision]);
await con.query('COMMIT;');
await con.release();
}
model.getParticipation = async (house_id) => {
const sql_text = `SELECT u.username, uw.decision
FROM users as u
LEFT JOIN users_war as uw ON uw.user_id = u.id
LEFT JOIN war_days as w ON w.id = uw.war_id
WHERE uw.house_id = ? AND w.completed = 0;`;
const data = await db.pool.query(sql_text, [house_id]);
return data;
}
module.exports = model;
\ No newline at end of file
const Koa = require('koa');
const Router = require('@koa/router');
const CronJob = require('cron').CronJob;
const router = new Router();