====== Rapid Public Service Deployment ====== Author: Andrey Shevyakov Description: A quick guide on how to implement an **SnmpManager** Grails service with which a client GUI can interact (regardless of the selected GUI framework). Steps: - Create a Grails service implementing the **DomainInteractor** trait that will provide the following CRUD methods: * **getDomainInstance()** * **getDomainInstanceBulk()** * **newDomainInstance()** * **newDomainInstanceBulk()** * **updateDomainInstance()** * **updateDomainInstanceBulk()** * **deleteDomainInstance()** * **deleteDomainInstanceBulk()** - In the service constructor, specify the following parameters (**DomainInteraction** trait): * **domainRefParam** - key referring to the domain name (same as **Class.simpleName**) in the received map (params) - example: "domainName" * **domainEntriesRefParam** - key referring to the entries collection in the received map (params) - example: "entriesToProcess" * **domainIdRefParam** - key referring to the ID of a single domain entry to be affected in the received map (params) - example: "idToProcess" * **domainIdsRefParam** - key referring to the IDs of the domain entries to be affected in the received map (params) - example: "idsToProcess" * **allowedDomains** - names of the domains that are allowed for processing by the service - example: ["Carrier", "DasHub"] - Create a Grails controller extending the **SecureController** - In the controller, implement a service accepting the client-sent JSON payload (**must** contain the keys specified in the **Step 2** for the valid CRUD processing) and calling the relevant service method and returning the processing results to the client in the JSON format. JSON-Request Example - Update CRUD: var data = JSON.stringify({ 'serviceAction' : 'updateDomainInstanceBulk', 'serviceDomain' : 'ResponsibilityType', 'serviceEntries' : [ {'id' : 30, 'name' : 'I was updated'}, {'id' : 27, 'name' : 'I was updated too'} ] }); JSON-Response Example - Update CRUD: { "results": [ { "id": 20, "ResponsibilityType": { "id": 20, "name": "I was updated", "class": "com.errigal.snmpmanager.knowledge.ResponsibilityType" }, "success": true }, { "id": 22, "ResponsibilityType": { "id": 22, "name": "I was updated too", "class": "com.errigal.snmpmanager.knowledge.ResponsibilityType" }, "success": true } ], "success": true } Diagrams: {{:development:snmp:domain_interactor_data_flow.png?1200|}} \\ \\ \\ \\ \\ {{:development:snmp:domain_helper_data_flow.png?1200|}}