Skip to content
Merged
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
34 changes: 20 additions & 14 deletions codbex-number-generator/codbex-number-generator.gen
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
{
"tablePrefix": "CODBEX_",
"brand": "codbex",
"brandUrl": "https://codbex.com",
"title": "Document Number Generator",
"description": "Generator for Document Numbers",
"fileName": "codbex-number-generator",
"dataSource": "DefaultDB",
"genFolderName": "codbex-number-generator",
"roles": [
{
"entityName": "Number",
"roleRead": "codbex-number-generator.Numbers.NumberReadOnly",
"roleWrite": "codbex-number-generator.Numbers.NumberFullAccess"
}
],
"brandUrl": "https://www.codbex.com/",
"title": "Number Generator managing module",
"description": "Managing number generator data",
"projectName": "codbex-number-generator",
"workspaceName": "workspace",
"filePath": "codbex-number-generator.model",
"templateId": "template-application-angular/template/template.js",
"templateId": "template-application-angular-v2/template/template.js",
"fileName": "codbex-number-generator",
"genFolderName": "codbex-number-generator",
"dataSource": "DefaultDB",
"perspectives": {
"Settings": {
"views": [
Expand All @@ -32,6 +25,14 @@
"role": ""
}
},
"roles": [
{
"entityName": "Number",
"roleRead": "codbex-number-generator.Numbers.NumberReadOnly",
"roleWrite": "codbex-number-generator.Numbers.NumberFullAccess"
}
],
"tprefix": "codbex-number-generator-model",
"models": [
{
"properties": [
Expand All @@ -54,6 +55,7 @@
"isCalculatedProperty": false,
"widgetLabel": "Id",
"widgetDropdownUrl": "",
"widgetDropdownControllerUrl": "",
"dataTypeJava": "int",
"dataTypeTypescript": "number",
"inputRule": ""
Expand All @@ -78,6 +80,7 @@
"isCalculatedProperty": false,
"widgetLabel": "Type",
"widgetDropdownUrl": "",
"widgetDropdownControllerUrl": "",
"dataTypeJava": "string",
"dataTypeTypescript": "string",
"minLength": 0,
Expand All @@ -104,6 +107,7 @@
"isCalculatedProperty": false,
"widgetLabel": "Prefix",
"widgetDropdownUrl": "",
"widgetDropdownControllerUrl": "",
"dataTypeJava": "string",
"dataTypeTypescript": "string",
"minLength": 0,
Expand All @@ -129,6 +133,7 @@
"isCalculatedProperty": false,
"widgetLabel": "Length",
"widgetDropdownUrl": "",
"widgetDropdownControllerUrl": "",
"dataTypeJava": "int",
"dataTypeTypescript": "number",
"inputRule": ""
Expand All @@ -152,6 +157,7 @@
"isCalculatedProperty": false,
"widgetLabel": "Value",
"widgetDropdownUrl": "",
"widgetDropdownControllerUrl": "",
"dataTypeJava": "int",
"dataTypeTypescript": "number",
"inputRule": ""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import { Controller, Get, Post, Put, Delete, Documentation, request, response } from '@aerokit/sdk/http'
import { HttpUtils } from "@aerokit/sdk/http/utils";
import { ValidationError } from '@aerokit/sdk/http/errors'
import { ForbiddenError } from '@aerokit/sdk/http/errors'
import { user } from '@aerokit/sdk/security'
import { Options } from '@aerokit/sdk/db'
import { Extensions } from "@aerokit/sdk/extensions"
import { Injected, Inject } from '@aerokit/sdk/component'
import { NumberRepository } from '../../data/Settings/NumberRepository'
import { NumberEntity } from '../../data/Settings/NumberEntity'

const validationModules = await Extensions.loadExtensionModules('codbex-number-generator-Settings-Number', ['validate']);

@Controller
@Documentation('codbex-number-generator - Number Controller')
@Injected()
class NumberController {

@Inject('NumberRepository')
private readonly repository!: NumberRepository;

@Get('/')
@Documentation('Get All Number')
public getAll(_: any, ctx: any): NumberEntity[] {
try {
this.checkPermissions('read');
const options: Options = {
limit: ctx.queryParameters["$limit"] ? parseInt(ctx.queryParameters["$limit"]) : 20,
offset: ctx.queryParameters["$offset"] ? parseInt(ctx.queryParameters["$offset"]) : 0,
language: request.getLocale().slice(0, 2)
};

return this.repository.findAll(options);
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Post('/')
@Documentation('Create Number')
public create(entity: NumberEntity): NumberEntity {
try {
this.checkPermissions('write');
this.validateEntity(entity);
entity.Id = this.repository.create(entity) as any;
response.setHeader('Content-Location', '/services/ts/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberService.ts/' + entity.Id);
response.setStatus(response.CREATED);
return entity;
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Get('/count')
@Documentation('Count Number')
public count(): { count: number } {
try {
this.checkPermissions('read');
return { count: this.repository.count() };
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Post('/count')
@Documentation('Count Number with filter')
public countWithFilter(filter: any): { count: number } {
try {
this.checkPermissions('read');
return { count: this.repository.count(filter) };
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Post('/search')
@Documentation('Search Number')
public search(filter: any): NumberEntity[] {
try {
this.checkPermissions('read');
return this.repository.findAll(filter);
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Get('/:id')
@Documentation('Get Number by id')
public getById(_: any, ctx: any): NumberEntity {
try {
this.checkPermissions('read');
const id = parseInt(ctx.pathParameters.id);
const options: Options = {
language: request.getLocale().slice(0, 2)
};
const entity = this.repository.findById(id, options);
if (entity) {
return entity;
} else {
HttpUtils.sendResponseNotFound('Number not found');
}
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Put('/:id')
@Documentation('Update Number by id')
public update(entity: NumberEntity, ctx: any): NumberEntity {
try {
this.checkPermissions('write');
const id = parseInt(ctx.pathParameters.id);
entity.Id = id;
this.validateEntity(entity);
this.repository.update(entity);
return entity;
} catch (error: any) {
this.handleError(error);
}
return undefined as any;
}

@Delete('/:id')
@Documentation('Delete Number by id')
public deleteById(_: any, ctx: any): void {
try {
this.checkPermissions('write');
const id = parseInt(ctx.pathParameters.id);
const entity = this.repository.findById(id);
if (entity) {
this.repository.deleteById(id);
HttpUtils.sendResponseNoContent();
} else {
HttpUtils.sendResponseNotFound('Number not found');
}
} catch (error: any) {
this.handleError(error);
}
}

private handleError(error: any) {
if (error.name === 'ForbiddenError') {
HttpUtils.sendForbiddenRequest(error.message);
} else if (error.name === 'ValidationError') {
HttpUtils.sendResponseBadRequest(error.message);
} else {
HttpUtils.sendInternalServerError(error.message);
}
}

private checkPermissions(operationType: string) {
if (operationType === 'read' && !(user.isInRole('codbex-number-generator.Numbers.NumberReadOnly') || user.isInRole('codbex-number-generator.Numbers.NumberFullAccess'))) {
throw new ForbiddenError();
}
if (operationType === 'write' && !user.isInRole('codbex-number-generator.Numbers.NumberFullAccess')) {
throw new ForbiddenError();
}
}

private validateEntity(entity: any): void {
if (entity.Type?.length > 50) {
throw new ValidationError(`The 'Type' exceeds the maximum length of [50] characters`);
}
if (entity.Prefix?.length > 20) {
throw new ValidationError(`The 'Prefix' exceeds the maximum length of [20] characters`);
}
for (const next of validationModules) {
next.validate(entity);
}
}

}
Loading