seepur/app/Controllers/Http/ClientApiController.js

223 lines
6.9 KiB
JavaScript

'use strict'
const {validate, rule} = use('Validator');
const User = use('App/Models/User');
const Child = use('App/Models/Child')
const Link = use('App/Models/Link');
const Call = use('App/Models/Call');
const Book = use('App/Models/Book');
const FileUtils = use('App/Utils/FileUtils');
const UserChildUtils = use('App/Utils/UserChildUtils');
const {v4: uuidv4} = require('uuid');
class ClientApiController {
async getUser({auth}) {
const user = auth.user.toJSON();
const connections = await UserChildUtils.getUserConnections(user.id);
const booksResponse = await Book.query()
.where({user_id: null})
.orWhere({user_id: user.id})
.fetch();
let books = [];
if (booksResponse.rows.length) books = booksResponse.rows;
return {
...user, connections: {...connections}, books
}
}
async createChild({auth, request, response}) {
const rules = {
name: 'required|string',
dob: 'required|date',
avatar: [rule('regex', /^(data:image\/\w+;base64).+/)]
};
const validation = await validate(request.all(), rules);
if (validation.fails()) {
response.status(400);
response.send({code: 400, message: validation.messages()});
return false;
}
const body = request.body;
if (body.avatar) {
const file = await FileUtils.saveBase64File(body.avatar);
body.avatar = `/u/images/${file.fileName}`;
} else {
body.avatar = `/images/default-child-avatar.png`;
}
const child = await Child.create(body);
const link = await Link.create(
{user_id: auth.user.id, child_id: child.id, is_parent: true});
response.status(201);
return {code: 201, child};
}
async getBooks() {}
async getCallBooks() {}
async createCall({auth, request, response}) {
try {
const user = auth.user;
const rules = {
connection_id: 'number|required',
child_id: 'number|required',
};
const validation = await validate(request.all(), rules);
if (validation.fails()) {
response.status(400);
response.send(validation.messages());
return false;
}
const body = request.body;
if (!(await UserChildUtils.isParentOf(user.id, body.child_id))) {
response.status(403);
response.send({code: 403, message: 'Unauthorized'});
return false;
}
if (!(await UserChildUtils.isUserConnectedToChild(
body.connection_id, body.child_id))) {
response.status(403);
response.send({code: 403, message: 'Unauthorized'});
return false;
}
const call = await Call.create({
state: 'NEW',
parent_id: user.id,
guest_id: body.connection_id,
child_id: body.child_id
});
return {
code: 0, data: call
}
} catch (error) {
console.error(error);
return error;
}
}
async getChild({auth, request, response}) {
const userId = auth.user.id;
const childId = request.params.id;
console.log(`${userId} -> ${childId}`);
const hasPermission =
await UserChildUtils.isUserConnectedToChild(userId, childId);
if (!hasPermission) {
response.status(403);
response.send(
{code: 403, message: `You have no permission to connect with child`});
return false;
}
const child = await Child.find(childId);
const parents = await UserChildUtils.getChildParents(childId);
const connections = await UserChildUtils.getChildConnections(childId);
return {
code: 0, data: {...child.toJSON(), parents, connections}
}
}
async createConnection({request, auth, response}) {
try {
const user = auth.user;
const rules = {
email: 'string|email|required',
is_parent: 'boolean|required',
child_id: 'number|required'
};
const validation = await validate(request.all(), rules);
if (validation.fails()) {
response.status(400);
response.send(validation.messages());
return false;
}
const body = request.body;
if (!await UserChildUtils.isParentOf(user.id, body.child_id)) {
response.status(403);
response.send({
code: 403,
message: `You have no permission to add connection to child`
});
return false;
}
const usersWithEmail =
(await User.query().where({email: body.email}).fetch()).rows;
if (!usersWithEmail.length) {
return {code: 404, message: 'No user with that Email...'};
}
const targetUser = usersWithEmail[0];
if (await UserChildUtils.isUserConnectedToChild(
targetUser.id, body.child_id)) {
return {code: 409, message: 'User already connected'};
}
return {
code: 0,
data: await UserChildUtils.addConnection(
body.child_id, targetUser.id, body.is_parent)
};
} catch (error) {
console.error(error);
return error;
}
//
}
async updateChild({request, auth, response}) {
const childId = request.params.id;
const userId = auth.user.id;
const {name, dob, profile_cover, avatar} = request.body;
const isParent = await UserChildUtils.isParentOf(userId, childId);
if (!isParent) {
response.status(403);
response.send(
{code: 403, message: `You have no permission to edit this child`});
return false;
}
// TODO: Add validation;
const child = await Child.find(childId);
child.dob = dob || child.dob;
if (profile_cover) {
const file = await FileUtils.saveBase64File(profile_cover);
child.profile_cover = `/u/images/${file.fileName}`;
}
if (avatar) {
const file = await FileUtils.saveBase64File(avatar);
child.avatar = `/u/images/${file.fileName}`;
}
await child.save();
return {code: 0, data: {child}};
}
async setChildProfileCover({request, auth, response}) {
try {
const rules = {
profile_cover: [rule('regex', /^(data:image\/\w+;base64).+/)]
};
const validation = await validate(request.all(), rules);
if (validation.fails()) {
response.status(400);
response.send(validation.messages());
return false;
}
const body = request.body;
const userId = auth.user.id;
const childId = request.params.id;
const isParent = await UserChildUtils.isParentOf(userId, childId);
if (!isParent) {
response.status(403);
response.send(
{code: 403, message: `You have no permission to edit this child`});
return false;
}
const child = await Child.find(childId);
const file = await FileUtils.saveBase64File(body.profile_cover);
console.log(file);
child.profile_cover = `/u/images/${file.fileName}`;
await child.save();
return child.profile_cover;
} catch (error) {
console.error(error);
return error;
}
}
}
module.exports = ClientApiController