diff --git a/codbex-number-generator/codbex-number-generator.gen b/codbex-number-generator/codbex-number-generator.gen index 5ed8529..b0dc713 100644 --- a/codbex-number-generator/codbex-number-generator.gen +++ b/codbex-number-generator/codbex-number-generator.gen @@ -1,15 +1,17 @@ { "tablePrefix": "CODBEX_", "brand": "codbex", - "brandUrl": "https://www.codbex.com", - "title": "Number Generator Management Application", - "description": "Managing number generator data", + "brandUrl": "https://www.codbex.com/", + "title": "Number generator Management Module", + "description": "Managing Number generator Data", "projectName": "codbex-number-generator", "workspaceName": "workspace", "filePath": "codbex-number-generator.model", - "templateId": "template-application-angular-v2/template/template.js", + "templateId": "template-application-angular-java/template/template.js", "fileName": "codbex-number-generator", "genFolderName": "codbex-number-generator", + "javaRuntime": true, + "javaGenFolderName": "codbex_number_generator", "dataSource": "DefaultDB", "perspectives": { "Settings": { @@ -60,6 +62,7 @@ "widgetDropdownControllerUrl": "", "dataTypeJava": "int", "dataTypeTypescript": "number", + "dataTypeJavaClass": "Integer", "inputRule": "" }, { @@ -87,6 +90,7 @@ "widgetDropdownControllerUrl": "", "dataTypeJava": "string", "dataTypeTypescript": "string", + "dataTypeJavaClass": "String", "minLength": 0, "maxLength": 50, "inputRule": "" @@ -116,6 +120,7 @@ "widgetDropdownControllerUrl": "", "dataTypeJava": "string", "dataTypeTypescript": "string", + "dataTypeJavaClass": "String", "minLength": 0, "maxLength": 20, "inputRule": "" @@ -144,6 +149,7 @@ "widgetDropdownControllerUrl": "", "dataTypeJava": "int", "dataTypeTypescript": "number", + "dataTypeJavaClass": "Integer", "inputRule": "" }, { @@ -170,6 +176,7 @@ "widgetDropdownControllerUrl": "", "dataTypeJava": "int", "dataTypeTypescript": "number", + "dataTypeJavaClass": "Integer", "inputRule": "" } ], @@ -200,6 +207,7 @@ "tooltip": "Number", "type": "SETTING", "dataSource": "DefaultDB", + "javaPerspectiveName": "settings", "referencedProjections": [], "primaryKeys": [ "Id" diff --git a/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberController.ts b/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberController.ts deleted file mode 100644 index 2292216..0000000 --- a/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberController.ts +++ /dev/null @@ -1,178 +0,0 @@ -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()?.split("_")[0] - }; - - 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/NumberController.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()?.split("_")[0] - }; - 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); - } - } - -} diff --git a/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberEntity.ts b/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberEntity.ts deleted file mode 100644 index 37e4af2..0000000 --- a/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberEntity.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Entity, Table, Id, Generated, Column, Documentation, CreatedAt, CreatedBy, UpdatedAt, UpdatedBy} from '@aerokit/sdk/db' - -@Entity('NumberEntity') -@Table('CODBEX_NUMBER') -@Documentation('Number entity mapping') -export class NumberEntity { - - @Id() - @Generated('sequence') - @Documentation('Id') - @Column({ - name: 'NUMBER_ID', - type: 'integer', - }) - public Id?: number; - - @Documentation('Type') - @Column({ - name: 'NUMBER_TYPE', - type: 'string', - length: 50, - }) - public Type!: string; - - @Documentation('Prefix') - @Column({ - name: 'NUMBER_PREFIX', - type: 'string', - length: 20, - }) - public Prefix!: string; - - @Documentation('Length') - @Column({ - name: 'NUMBER_LENGTH', - type: 'integer', - nullable: true, - }) - public Length?: number; - - @Documentation('Value') - @Column({ - name: 'NUMBER_VALUE', - type: 'integer', - nullable: true, - }) - public Value?: number; - -} - -(new NumberEntity()); diff --git a/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberRepository.ts b/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberRepository.ts deleted file mode 100644 index 023f06e..0000000 --- a/codbex-number-generator/gen/codbex-number-generator/data/Settings/NumberRepository.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Repository, EntityEvent, EntityConstructor, Options } from '@aerokit/sdk/db' -import { Component } from '@aerokit/sdk/component' -import { Producer } from '@aerokit/sdk/messaging' -import { Extensions } from '@aerokit/sdk/extensions' -import { NumberEntity } from './NumberEntity' - -@Component('NumberRepository') -export class NumberRepository extends Repository { - - constructor() { - super((NumberEntity as EntityConstructor)); - } - - protected override async triggerEvent(data: EntityEvent): Promise { - const triggerExtensions = await Extensions.loadExtensionModules('codbex-number-generator-Settings-Number', ['trigger']); - triggerExtensions.forEach(triggerExtension => { - try { - triggerExtension.trigger(data); - } catch (error) { - console.error(error); - } - }); - Producer.topic('codbex-number-generator-Settings-Number').send(JSON.stringify(data)); - } -} diff --git a/codbex-number-generator/gen/codbex-number-generator/odata/codbex-number-generator.odata b/codbex-number-generator/gen/codbex-number-generator/odata/codbex-number-generator.odata deleted file mode 100644 index f149140..0000000 --- a/codbex-number-generator/gen/codbex-number-generator/odata/codbex-number-generator.odata +++ /dev/null @@ -1,4 +0,0 @@ -{ - "namespace": "", - "entities": [] -} diff --git a/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/controller.js b/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/controller.js index 1145b80..3d2471f 100644 --- a/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/controller.js +++ b/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/controller.js @@ -1,6 +1,6 @@ angular.module('page', ['blimpKit', 'platformView', 'platformLocale', 'EntityService']) .config(['EntityServiceProvider', (EntityServiceProvider) => { - EntityServiceProvider.baseUrl = '/services/ts/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberController.ts'; + EntityServiceProvider.baseUrl = '/services/java/codbex-number-generator/gen/codbex_number_generator/api/settings/NumberController'; }]) .controller('PageController', ($scope, EntityService, Extensions, LocaleService, ButtonStates) => { const Dialogs = new DialogHub(); diff --git a/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/dialog-window/controller.js b/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/dialog-window/controller.js index 47ce9b2..6c16772 100644 --- a/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/dialog-window/controller.js +++ b/codbex-number-generator/gen/codbex-number-generator/ui/Settings/Number/dialog-window/controller.js @@ -1,6 +1,6 @@ angular.module('page', ['blimpKit', 'platformView', 'platformLocale', 'EntityService']) .config(['EntityServiceProvider', (EntityServiceProvider) => { - EntityServiceProvider.baseUrl = '/services/ts/codbex-number-generator/gen/codbex-number-generator/api/Settings/NumberController.ts'; + EntityServiceProvider.baseUrl = '/services/java/codbex-number-generator/gen/codbex_number_generator/api/settings/NumberController'; }]) .controller('PageController', ($scope, $http, ViewParameters, LocaleService, EntityService) => { const Dialogs = new DialogHub(); diff --git a/codbex-number-generator/gen/codbex_number_generator/api/settings/NumberController.java b/codbex-number-generator/gen/codbex_number_generator/api/settings/NumberController.java new file mode 100644 index 0000000..b380149 --- /dev/null +++ b/codbex-number-generator/gen/codbex_number_generator/api/settings/NumberController.java @@ -0,0 +1,170 @@ +package gen.codbex_number_generator.api.settings; + +import gen.codbex_number_generator.data.settings.NumberEntity; +import gen.codbex_number_generator.data.settings.NumberRepository; + +import org.eclipse.dirigible.components.api.security.UserFacade; +import org.eclipse.dirigible.engine.java.annotations.Documentation; +import org.eclipse.dirigible.engine.java.annotations.Inject; +import org.eclipse.dirigible.engine.java.annotations.http.Body; +import org.eclipse.dirigible.engine.java.annotations.http.Controller; +import org.eclipse.dirigible.engine.java.annotations.http.Delete; +import org.eclipse.dirigible.engine.java.annotations.http.Get; +import org.eclipse.dirigible.engine.java.annotations.http.PathParam; +import org.eclipse.dirigible.engine.java.annotations.http.Post; +import org.eclipse.dirigible.engine.java.annotations.http.Put; +import org.eclipse.dirigible.engine.java.annotations.http.QueryParam; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +@Controller +@Documentation("codbex-number-generator - Number Controller") +public class NumberController { + + private static final Set FILTER_FIELDS = Set.of("Id", "Type", "Prefix", "Length", "Value"); + + @Inject + private NumberRepository repository; + + @Get + @Documentation("List Number") + public List getAll(@QueryParam("$limit") Integer limit, + @QueryParam("$offset") Integer offset) { + checkPermissions("read"); + int actualLimit = limit != null ? limit.intValue() : 20; + int actualOffset = offset != null ? offset.intValue() : 0; + List result = repository.findAll(actualLimit, actualOffset); + return result; + } + + @Get("/count") + @Documentation("Count Number") + public Map count() { + checkPermissions("read"); + return Map.of("count", repository.count()); + } + + @Post("/count") + @Documentation("Count Number with filter") + public Map countWithFilter(@Body Map filter) { + checkPermissions("read"); + return Map.of("count", (long) runFilter(filter).size()); + } + + @Post("/search") + @Documentation("Search Number") + public List search(@Body Map filter) { + checkPermissions("read"); + List result = runFilter(filter); + return result; + } + + @Get("/{id}") + @Documentation("Get Number by id") + public NumberEntity getById(@PathParam("id") Integer id) { + checkPermissions("read"); + NumberEntity entity = repository.findOne(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Number not found")); + return entity; + } + + @Post + @Documentation("Create Number") + public NumberEntity create(@Body NumberEntity entity) { + checkPermissions("write"); + validate(entity); + return repository.save(entity); + } + + @Put("/{id}") + @Documentation("Update Number by id") + public NumberEntity update(@PathParam("id") Integer id, @Body NumberEntity entity) { + checkPermissions("write"); + entity.Id = id; + validate(entity); + return repository.update(entity); + } + + @Delete("/{id}") + @Documentation("Delete Number by id") + public void deleteById(@PathParam("id") Integer id) { + checkPermissions("write"); + if (repository.findOne(id).isEmpty()) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Number not found"); + } + repository.deleteById(id); + } + + private List runFilter(Map filter) { + StringBuilder hql = new StringBuilder("from NumberEntity e"); + Map params = new LinkedHashMap<>(); + boolean first = true; + if (filter != null && filter.get("equals") instanceof Map equals) { + for (Map.Entry entry : equals.entrySet()) { + String field = requireKnownField(String.valueOf(entry.getKey())); + String paramName = "p" + params.size(); + hql.append(first ? " where e." : " and e.").append(field).append(" = :").append(paramName); + params.put(paramName, entry.getValue()); + first = false; + } + } + if (filter != null && filter.get("conditions") instanceof List conditions) { + for (Object raw : conditions) { + if (!(raw instanceof Map condition)) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid filter condition"); + } + String field = requireKnownField(String.valueOf(condition.get("propertyName"))); + String operator = String.valueOf(condition.get("operator")).toUpperCase(Locale.ROOT); + Object value = condition.get("value"); + String paramName = "p" + params.size(); + String clause = switch (operator) { + case "EQ" -> "e." + field + " = :" + paramName; + case "IN" -> { + if (!(value instanceof Collection)) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "IN value must be a list for field: " + field); + } + yield "e." + field + " in (:" + paramName + ")"; + } + case "LIKE" -> "e." + field + " like :" + paramName; + default -> throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Unsupported operator: " + operator); + }; + hql.append(first ? " where " : " and ").append(clause); + params.put(paramName, value); + first = false; + } + } + return repository.query(hql.toString(), params); + } + + private static String requireKnownField(String field) { + if (!FILTER_FIELDS.contains(field)) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Unknown filter field: " + field); + } + return field; + } + + private void checkPermissions(String op) { + if ("read".equals(op) && !(UserFacade.isInRole("codbex-number-generator.Numbers.NumberReadOnly") || UserFacade.isInRole("codbex-number-generator.Numbers.NumberFullAccess"))) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN); + } + if ("write".equals(op) && !UserFacade.isInRole("codbex-number-generator.Numbers.NumberFullAccess")) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN); + } + } + + private static void validate(NumberEntity entity) { + if (entity.Type != null && entity.Type.length() > 50) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "The 'Type' exceeds the maximum length of 50"); + } + if (entity.Prefix != null && entity.Prefix.length() > 20) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "The 'Prefix' exceeds the maximum length of 20"); + } + } +} diff --git a/codbex-number-generator/gen/codbex-number-generator/data/Settings/Number.extensionpoint b/codbex-number-generator/gen/codbex_number_generator/data/settings/Number.extensionpoint similarity index 98% rename from codbex-number-generator/gen/codbex-number-generator/data/Settings/Number.extensionpoint rename to codbex-number-generator/gen/codbex_number_generator/data/settings/Number.extensionpoint index e26b8da..0db1220 100644 --- a/codbex-number-generator/gen/codbex-number-generator/data/Settings/Number.extensionpoint +++ b/codbex-number-generator/gen/codbex_number_generator/data/settings/Number.extensionpoint @@ -1,4 +1,4 @@ { "name": "codbex-number-generator-Settings-Number", "description": "Extension Point for the codbex-number-generator-Settings-Number entity" -} \ No newline at end of file +} diff --git a/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberEntity.java b/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberEntity.java new file mode 100644 index 0000000..c0114e9 --- /dev/null +++ b/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberEntity.java @@ -0,0 +1,42 @@ +package gen.codbex_number_generator.data.settings; + +import org.eclipse.dirigible.engine.java.annotations.Column; +import org.eclipse.dirigible.engine.java.annotations.CreatedAt; +import org.eclipse.dirigible.engine.java.annotations.CreatedBy; +import org.eclipse.dirigible.engine.java.annotations.Documentation; +import org.eclipse.dirigible.engine.java.annotations.Entity; +import org.eclipse.dirigible.engine.java.annotations.GeneratedValue; +import org.eclipse.dirigible.engine.java.annotations.GenerationType; +import org.eclipse.dirigible.engine.java.annotations.Id; +import org.eclipse.dirigible.engine.java.annotations.Table; +import org.eclipse.dirigible.engine.java.annotations.UpdatedAt; +import org.eclipse.dirigible.engine.java.annotations.UpdatedBy; + +@Entity +@Table(name = "CODBEX_NUMBER") +@Documentation("Number entity mapping") +public class NumberEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "NUMBER_ID") + @Documentation("Id") + public Integer Id; + + @Column(name = "NUMBER_TYPE", length = 50, nullable = false, unique = true) + @Documentation("Type") + public String Type; + + @Column(name = "NUMBER_PREFIX", length = 20, nullable = false, unique = true) + @Documentation("Prefix") + public String Prefix; + + @Column(name = "NUMBER_LENGTH", nullable = true) + @Documentation("Length") + public Integer Length; + + @Column(name = "NUMBER_VALUE", nullable = true) + @Documentation("Value") + public Integer Value; + +} diff --git a/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberRepository.java b/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberRepository.java new file mode 100644 index 0000000..a0b17b4 --- /dev/null +++ b/codbex-number-generator/gen/codbex_number_generator/data/settings/NumberRepository.java @@ -0,0 +1,12 @@ +package gen.codbex_number_generator.data.settings; + +import org.eclipse.dirigible.components.data.store.java.repository.JavaRepository; +import org.eclipse.dirigible.engine.java.annotations.Repository; + +@Repository +public class NumberRepository extends JavaRepository { + + public NumberRepository() { + super(NumberEntity.class); + } +} diff --git a/codbex-number-generator/gen/codbex-number-generator/roles/default-roles.roles b/codbex-number-generator/gen/codbex_number_generator/roles/default-roles.roles similarity index 99% rename from codbex-number-generator/gen/codbex-number-generator/roles/default-roles.roles rename to codbex-number-generator/gen/codbex_number_generator/roles/default-roles.roles index 1951a9c..d60661d 100644 --- a/codbex-number-generator/gen/codbex-number-generator/roles/default-roles.roles +++ b/codbex-number-generator/gen/codbex_number_generator/roles/default-roles.roles @@ -7,4 +7,4 @@ "name": "codbex-number-generator.Numbers.NumberFullAccess", "description": "A role that grants full access for Number." } -] \ No newline at end of file +] diff --git a/codbex-number-generator/service/Generator.java b/codbex-number-generator/service/Generator.java new file mode 100644 index 0000000..7079626 --- /dev/null +++ b/codbex-number-generator/service/Generator.java @@ -0,0 +1,66 @@ +package service; + +import gen.codbex_number_generator.data.settings.NumberEntity; +import gen.codbex_number_generator.data.settings.NumberRepository; + +import org.eclipse.dirigible.sdk.component.Inject; + +import java.util.List; +import java.util.Map; + +public class Generator { + + @Inject + private NumberRepository numberRepository; + + public String generate(Integer id) { + try { + NumberEntity entity = numberRepository.findOne(id) + .orElseThrow(() -> + new RuntimeException("Entity with id " + id + " not found")); + + return generateNumber(entity); + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public String generateByType(String genType) { + try { + List < NumberEntity > entities = numberRepository.query( + "from NumberEntity e where e.Type = :type", + Map.of("type", genType) + ); + + if (entities.isEmpty()) { + throw new RuntimeException( + "Entity with type " + genType + " not found"); + } + + return generateNumber(entities.get(0)); + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private String generateNumber(NumberEntity entity) { + entity.Value = entity.Value + 1; + numberRepository.update(entity); + + String prefix = entity.Prefix != null ? entity.Prefix : ""; + + int totalLength = entity.Length != null ? entity.Length : 0; + int numericLength = Math.max(0, totalLength - prefix.length()); + + String paddedValue = String.format( + "%0" + numericLength + "d", + entity.Value + ); + + return prefix + paddedValue; + } +} diff --git a/codbex-number-generator/service/generator.ts b/codbex-number-generator/service/generator.ts deleted file mode 100644 index d44c085..0000000 --- a/codbex-number-generator/service/generator.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { NumberRepository } from "../gen/codbex-number-generator/data/Settings/NumberRepository"; -import { Operator } from '@aerokit/sdk/db' - -export class NumberGeneratorService { - - private readonly numberRepository = new NumberRepository(); - - public generate(id: number): string | undefined { - try { - const entity = this.numberRepository.findById(id); - - if (!entity) { - throw new Error(`Entity with id ${id} not found`); - } - - entity.Value! += 1; - this.numberRepository.update(entity); - - const zeroPad = (num: number, places: number) => String(num).padStart(places, '0'); - const result: string = (entity.Prefix ? entity.Prefix : "") - + zeroPad(entity.Value!, entity.Length! - - (entity.Prefix ? entity.Prefix.length : 0)); - - return result; - - } catch (error: any) { - console.error(error); - } - } - - public generateByType(genType: string): string | undefined { - try { - - const entity = this.numberRepository.findAll({ - conditions: [ - { - propertyName: "Type", - operator: Operator.EQ, - value: genType - } - ], - limit: 1 - })[0]; - - if (!entity) { - throw new Error(`Entity with type ${genType} not found`); - } - - entity.Value! += 1; - this.numberRepository.update(entity); - - const zeroPad = (num: number, places: number) => String(num).padStart(places, '0'); - const result: string = (entity.Prefix ? entity.Prefix : "") - + zeroPad(entity.Value!, entity.Length! - - (entity.Prefix ? entity.Prefix.length : 0)); - - return result; - - } catch (error: any) { - console.error(error); - } - } - -} \ No newline at end of file