diff --git a/README.md b/README.md index 4bd4ada..ca82b11 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # codbex-cities + Cities Management Module + +### Model + +![model](images/cities-model.png) diff --git a/codbex-cities/codbex-cities.edm b/codbex-cities/codbex-cities.edm index 50eb390..6a23114 100644 --- a/codbex-cities/codbex-cities.edm +++ b/codbex-cities/codbex-cities.edm @@ -1,11 +1,11 @@ - + - + @@ -20,5 +20,5 @@ - + \ No newline at end of file diff --git a/codbex-cities/codbex-cities.gen b/codbex-cities/codbex-cities.gen index 741d98f..76826a7 100644 --- a/codbex-cities/codbex-cities.gen +++ b/codbex-cities/codbex-cities.gen @@ -56,6 +56,13 @@ "role": "" } }, + "roles": [ + { + "entityName": "City", + "roleRead": "codbex-cities.Cities.CityReadOnly", + "roleWrite": "codbex-cities.Cities.CityFullAccess" + } + ], "models": [ { "properties": [ @@ -143,6 +150,7 @@ "dataName": "CITY", "dataQuery": "", "description": "Manage entity City", + "generateDefaultRoles": "true", "generateReport": "false", "icon": "/services/web/resources/unicons/file.svg", "layoutType": "MANAGE_MASTER", @@ -156,6 +164,8 @@ "perspectiveName": "Cities", "perspectiveOrder": "100", "perspectiveRole": "", + "roleRead": "codbex-cities.Cities.CityReadOnly", + "roleWrite": "codbex-cities.Cities.CityFullAccess", "title": "City", "tooltip": "City", "type": "SETTING", @@ -377,6 +387,7 @@ "dataName": "COUNTRY", "dataQuery": "", "description": "Manage entity Country", + "generateDefaultRoles": "false", "generateReport": "false", "icon": "/services/web/resources/unicons/file.svg", "layoutType": "MANAGE", diff --git a/codbex-cities/codbex-cities.model b/codbex-cities/codbex-cities.model index 71383d2..7f230d0 100644 --- a/codbex-cities/codbex-cities.model +++ b/codbex-cities/codbex-cities.model @@ -56,6 +56,7 @@ "dataName": "CITY", "dataQuery": "", "description": "Manage entity City", + "generateDefaultRoles": "true", "generateReport": "false", "icon": "/services/web/resources/unicons/file.svg", "layoutType": "MANAGE_MASTER", @@ -69,6 +70,8 @@ "perspectiveName": "Cities", "perspectiveOrder": "100", "perspectiveRole": "", + "roleRead": "codbex-cities.Cities.CityReadOnly", + "roleWrite": "codbex-cities.Cities.CityFullAccess", "title": "City", "tooltip": "City", "type": "SETTING" @@ -161,6 +164,7 @@ "dataName": "COUNTRY", "dataQuery": "", "description": "Manage entity Country", + "generateDefaultRoles": "false", "generateReport": "false", "icon": "/services/web/resources/unicons/file.svg", "layoutType": "MANAGE", diff --git a/codbex-cities/gen/codbex-cities/api/Cities/CityService.ts b/codbex-cities/gen/codbex-cities/api/Cities/CityService.ts index 45fed76..0017921 100644 --- a/codbex-cities/gen/codbex-cities/api/Cities/CityService.ts +++ b/codbex-cities/gen/codbex-cities/api/Cities/CityService.ts @@ -1,6 +1,8 @@ import { Controller, Get, Post, Put, Delete, response } from "sdk/http" import { Extensions } from "sdk/extensions" import { CityRepository, CityEntityOptions } from "../../dao/Cities/CityRepository"; +import { user } from "sdk/security" +import { ForbiddenError } from "../utils/ForbiddenError"; import { ValidationError } from "../utils/ValidationError"; import { HttpUtils } from "../utils/HttpUtils"; @@ -14,6 +16,7 @@ class CityService { @Get("/") public getAll(_: any, ctx: any) { try { + this.checkPermissions("read"); const options: CityEntityOptions = { $limit: ctx.queryParameters["$limit"] ? parseInt(ctx.queryParameters["$limit"]) : undefined, $offset: ctx.queryParameters["$offset"] ? parseInt(ctx.queryParameters["$offset"]) : undefined @@ -28,6 +31,7 @@ class CityService { @Post("/") public create(entity: any) { try { + this.checkPermissions("write"); this.validateEntity(entity); entity.Id = this.repository.create(entity); response.setHeader("Content-Location", "/services/ts/codbex-cities/gen/codbex-cities/api/Cities/CityService.ts/" + entity.Id); @@ -41,6 +45,7 @@ class CityService { @Get("/count") public count() { try { + this.checkPermissions("read"); return this.repository.count(); } catch (error: any) { this.handleError(error); @@ -50,6 +55,7 @@ class CityService { @Post("/count") public countWithFilter(filter: any) { try { + this.checkPermissions("read"); return this.repository.count(filter); } catch (error: any) { this.handleError(error); @@ -59,6 +65,7 @@ class CityService { @Post("/search") public search(filter: any) { try { + this.checkPermissions("read"); return this.repository.findAll(filter); } catch (error: any) { this.handleError(error); @@ -68,6 +75,7 @@ class CityService { @Get("/:id") public getById(_: any, ctx: any) { try { + this.checkPermissions("read"); const id = parseInt(ctx.pathParameters.id); const entity = this.repository.findById(id); if (entity) { @@ -83,6 +91,7 @@ class CityService { @Put("/:id") public update(entity: any, ctx: any) { try { + this.checkPermissions("write"); entity.Id = ctx.pathParameters.id; this.validateEntity(entity); this.repository.update(entity); @@ -95,6 +104,7 @@ class CityService { @Delete("/:id") public deleteById(_: any, ctx: any) { try { + this.checkPermissions("write"); const id = ctx.pathParameters.id; const entity = this.repository.findById(id); if (entity) { @@ -118,6 +128,15 @@ class CityService { } } + private checkPermissions(operationType: string) { + if (operationType === "read" && !(user.isInRole("codbex-cities.Cities.CityReadOnly") || user.isInRole("codbex-cities.Cities.CityFullAccess"))) { + throw new ForbiddenError(); + } + if (operationType === "write" && !user.isInRole("codbex-cities.Cities.CityFullAccess")) { + throw new ForbiddenError(); + } + } + private validateEntity(entity: any): void { if (entity.Name === null || entity.Name === undefined) { throw new ValidationError(`The 'Name' property is required, provide a valid value`); diff --git a/codbex-cities/gen/codbex-cities/index.html b/codbex-cities/gen/codbex-cities/index.html index 6888fb4..dc5605c 100644 --- a/codbex-cities/gen/codbex-cities/index.html +++ b/codbex-cities/gen/codbex-cities/index.html @@ -49,7 +49,7 @@ .constant('extensionPoint', { perspectives: "codbex-cities", views: "codbex-cities-view", - dialogWindows: "codbex-cities-dialog-window" + dialogWindows: "dialog-window" }) .config(["messageHubProvider", function (messageHubProvider) { messageHubProvider.eventIdPrefix = 'codbex-cities.launchpad.Home'; diff --git a/codbex-cities/gen/codbex-cities/roles/default-roles.roles b/codbex-cities/gen/codbex-cities/roles/default-roles.roles new file mode 100644 index 0000000..c896ce4 --- /dev/null +++ b/codbex-cities/gen/codbex-cities/roles/default-roles.roles @@ -0,0 +1,10 @@ +[ + { + "name": "codbex-cities.Cities.CityReadOnly", + "description": "A role that grants read only permission for City." + }, + { + "name": "codbex-cities.Cities.CityFullAccess", + "description": "A role that grants full access for City." + } +] \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.extension index 08bcef7..bf93e98 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.extension @@ -1,5 +1,6 @@ { "module": "codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.js", "extensionPoint": "dialog-window", - "description": "codbex-cities - Application Dialog Window" + "description": "codbex-cities - Application Dialog Window", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" } \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.js b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.js index a3e48cc..ee44710 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/view.js @@ -7,7 +7,7 @@ const viewData = { id: "City-filter", label: "City Filter", link: "/services/web/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-filter/index.html", - perspectiveName: "Cities", + perspectiveName: "Cities" }; if (typeof exports !== 'undefined') { diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.extension index 63fbcd5..c7a47d4 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.extension @@ -1 +1,6 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.js","extensionPoint":"dialog-window","description":"codbex-cities - Application Dialog Window"} \ No newline at end of file +{ + "module": "{{projectName}}/gen/{{genFolderName}}/ui/{{perspectiveName}}/{{name}}/dialog-window/view.js", + "extensionPoint": "dialog-window", + "description": "{{projectName}} - Application Dialog Window", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.js b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.js index 53c2cd7..8021c5a 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/view.js @@ -8,6 +8,9 @@ const viewData = { label: "City", link: "/services/web/codbex-cities/gen/codbex-cities/ui/Cities/City/dialog-window/index.html", perspectiveName: "Cities", + roles: [ + "codbex-cities.Cities.CityReadOnly", + ] }; if (typeof exports !== 'undefined') { diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.extension index c4f0023..d6937ba 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.extension @@ -1 +1,6 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js","extensionPoint":"codbex-cities-view","description":"codbex-cities - Application View - Main Details"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js", + "extensionPoint": "codbex-cities-view", + "description": "codbex-cities - Application View - Main Details", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js b/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js index b2b5982..a0e3291 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/view.js @@ -9,7 +9,7 @@ const viewData = { factory: "frame", region: "center", link: "/services/web/codbex-cities/gen/codbex-cities/ui/Cities/City/main-details/index.html", - perspectiveName: "Cities", + perspectiveName: "Cities" }; if (typeof exports !== 'undefined') { diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile-portal.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile-portal.extension index a507f51..80c20bc 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile-portal.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile-portal.extension @@ -1 +1,6 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js","extensionPoint":"portal-tile","description":"codbex-cities - Application Tile"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js", + "extensionPoint": "portal-tile", + "description": "codbex-cities - Application Tile", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.extension index 0f96f76..6de0283 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.extension @@ -1 +1,6 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js","extensionPoint":"codbex-cities-tile","description":"codbex-cities - Application Tile"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js", + "extensionPoint": "codbex-cities-tile", + "description": "codbex-cities - Application Tile", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js index 15bd7e8..7c3ba80 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/tile.js @@ -14,6 +14,6 @@ exports.getTile = function () { icon: "/services/web/resources/unicons/file.svg", location: "/services/web/codbex-cities/gen/codbex-cities/ui/Cities/index.html", order: "100", - groupOrder: "100", + groupOrder: "100" }; -}; +} diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/view.extension b/codbex-cities/gen/codbex-cities/ui/Cities/City/view.extension index 0ff88f5..bd916a8 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/view.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/view.extension @@ -1 +1,6 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/City/view.js","extensionPoint":"codbex-cities-view","description":"codbex-cities - Application View"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/City/view.js", + "extensionPoint": "codbex-cities-view", + "description": "codbex-cities - Application View", + "role": "codbex-cities.Cities.CityReadOnly,codbex-cities.Cities.CityFullAccess" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/City/view.js b/codbex-cities/gen/codbex-cities/ui/Cities/City/view.js index c21f017..ba4399e 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/City/view.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/City/view.js @@ -9,7 +9,7 @@ const viewData = { factory: "frame", region: "left", link: "/services/web/codbex-cities/gen/codbex-cities/ui/Cities/City/index.html", - perspectiveName: "Cities", + perspectiveName: "Cities" }; if (typeof exports !== 'undefined') { diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/perspective-portal.extension b/codbex-cities/gen/codbex-cities/ui/Cities/perspective-portal.extension index 2eda892..4c16327 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/perspective-portal.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/perspective-portal.extension @@ -1 +1,5 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/perspective.js","extensionPoint":"portal","description":"codbex-cities - Perspective - Cities"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/perspective.js", + "extensionPoint": "portal", + "description": "codbex-cities - Perspective - Cities" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/perspective.extension b/codbex-cities/gen/codbex-cities/ui/Cities/perspective.extension index 84848f1..7365727 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/perspective.extension +++ b/codbex-cities/gen/codbex-cities/ui/Cities/perspective.extension @@ -1 +1,5 @@ -{"module":"codbex-cities/gen/codbex-cities/ui/Cities/perspective.js","extensionPoint":"codbex-cities","description":"codbex-cities - Perspective - Cities"} \ No newline at end of file +{ + "module": "codbex-cities/gen/codbex-cities/ui/Cities/perspective.js", + "extensionPoint": "codbex-cities", + "description": "codbex-cities - Perspective - Cities" +} \ No newline at end of file diff --git a/codbex-cities/gen/codbex-cities/ui/Cities/perspective.js b/codbex-cities/gen/codbex-cities/ui/Cities/perspective.js index 91eff08..d6d0d2b 100644 --- a/codbex-cities/gen/codbex-cities/ui/Cities/perspective.js +++ b/codbex-cities/gen/codbex-cities/ui/Cities/perspective.js @@ -7,8 +7,8 @@ const perspectiveData = { id: 'Cities', name: 'Cities', link: '/services/web/codbex-cities/gen/codbex-cities/ui/Cities/index.html', - order: 100, - icon: '/services/web/resources/unicons/building.svg', + order: '100', + icon: '/services/web/resources/unicons/building.svg' }; if (typeof exports !== 'undefined') { diff --git a/codbex-cities/gen/codbex-cities/ui/launchpad/dialog-window.extensionpoint b/codbex-cities/gen/codbex-cities/ui/launchpad/dialog-window.extensionpoint index 824a9cf..063e95a 100644 --- a/codbex-cities/gen/codbex-cities/ui/launchpad/dialog-window.extensionpoint +++ b/codbex-cities/gen/codbex-cities/ui/launchpad/dialog-window.extensionpoint @@ -1,4 +1,4 @@ { - "name": "codbex-cities-dialog-window", + "name": "dialog-window", "description": "codbex-cities - Extension Point for the Application Dialog Window Providers" } \ No newline at end of file diff --git a/codbex-cities/navigations/cities/navigation.extension b/codbex-cities/navigations/cities/navigation.extension index e1ad41e..6fa510a 100644 --- a/codbex-cities/navigations/cities/navigation.extension +++ b/codbex-cities/navigations/cities/navigation.extension @@ -1,5 +1,6 @@ { "extensionPoint": "dashboard-navigations", "module": "codbex-cities/navigations/cities/service.js", - "description": "Cities Navigation" + "description": "Cities Navigation", + "role": "codbex-cities.Cities.CityFullAccess,codbex-cities.Cities.CityReadOnly" } \ No newline at end of file diff --git a/images/cities-model.png b/images/cities-model.png new file mode 100644 index 0000000..dcdffd6 Binary files /dev/null and b/images/cities-model.png differ