223 lines
6.9 KiB
JavaScript
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
|