import {inject, singleton} from 'tsyringe' import {RingtoneService} from './service' import {DoubleDeletionError} from './response' @singleton() export class RingtoneController { constructor( @inject('RingtoneService') private readonly ringtoneService: RingtoneService ) { } get = async (request: any, reply: any) => { try { const data = await this.ringtoneService.get(request.params['id']) if (typeof (data.deletedAt as Date) !== 'undefined') { reply.raw.statusMessage = 'Ringtone Deleted Previously' reply.gone() return } if (!data) { reply.raw.statusMessage = 'Ringtone Not Found' reply.notFound() return } reply.raw.statusMessage = 'Single Ringtone Retrieved' return { data, } } catch (err) { reply.raw.statusMessage = 'Get Ringtone Error' reply.internalServerError(err.message) } } browse = async (request: any, reply: any) => { try { // TODO deserialize query const { 'skip': skipRaw, 'take': takeRaw } = request.query const skipNumber = Number(skipRaw) const takeNumber = Number(takeRaw) const skip = !isNaN(skipNumber) ? skipNumber : undefined const take = !isNaN(takeNumber) ? takeNumber : undefined reply.raw.statusMessage = 'Multiple Ringtones Retrieved' return { data: await this.ringtoneService.browse(skip, take), skip, take, } } catch (err) { reply.raw.statusMessage = 'Browse Ringtones Error' reply.internalServerError(err.message) } } search = async (request: any, reply: any) => { try { const { 'q': query } = request.query reply.raw.statusMessage = 'Search Results Retrieved' return { data: await this.ringtoneService.search(query), query, } } catch (err) { reply.raw.statusMessage = 'Search Error' reply.internalServerError(err.message) } } create = async (request: any, reply: any) => { try { const data = await this.ringtoneService.create(request.body) reply.raw.statusMessage = 'Ringtone Created' reply.raw.statusCode = 201 return { data, } } catch (err) { reply.raw.statusMessage = 'Create Ringtone Error' reply.internalServerError(err.message) } } update = async (request: any, reply: any) => { try { // TODO validate data const data = await this.ringtoneService.update({ ...request.body, id: request.params['id'], }) if (data.deletedAt !== null) { reply.raw.statusMessage = 'Ringtone Deleted Previously' reply.gone() return } if (!data) { reply.raw.statusMessage = 'Ringtone Not Found' reply.notFound() return } reply.raw.statusMessage = 'Ringtone Updated' return { data, } } catch (err) { reply.internalServerError(err.message) } } softDelete = async (request: any, reply: any) => { try { // TODO validate data const data = await this.ringtoneService.softDelete(request.params['id']) if (!data) { reply.raw.statusMessage = 'Ringtone Not Found' reply.notFound() return } reply.raw.statusMessage = 'Ringtone Soft-Deleted' return { data, } } catch (err) { reply.raw.statusMessage = 'Soft-Delete Ringtone Error' reply.internalServerError(err.message) } } undoDelete = async (request: any, reply: any) => { try { // TODO validate data const data = await this.ringtoneService.undoDelete(request.params['id']) if (!data) { reply.raw.statusMessage = 'Ringtone Not Found' reply.notFound() return } reply.raw.statusMessage = 'Ringtone Restored' return { data, } } catch (err) { reply.raw.statusMessage = 'Restore Ringtone Error' reply.internalServerError(err.message) } } hardDelete = async (request: any, reply: any) => { try { // TODO validate data await this.ringtoneService.hardDelete(request.params['id']) reply.status(204) reply.raw.statusMessage = 'Ringtone Hard-Deleted' } catch (err) { if (err instanceof DoubleDeletionError) { reply.raw.statusMessage = 'Ringtone Not Found' reply.notFound(err.message) } reply.raw.statusMessage = 'Delete Ringtone Error' reply.internalServerError(err.message) } } }