diff --git a/backend/src/main.ts b/backend/src/main.ts index e3a34ab..ef7156b 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -24,16 +24,19 @@ require('./passport').setupStrategies(passport); const pubApiDNSRoute = require('./routes/public/dnsRoutes'); const pubApiUserRoutes = require('./routes/public/userRoutes')(passport); -app.use('/dns', pubApiDNSRoute); -app.use('/user', pubApiUserRoutes); - const prvApiTenantRoute = require('./routes/private/tenantRoutes'); const prtApiUserRoutes = require('./routes/private/userRoutes'); +const prtApiDeviceRoutes = require('./routes/private/deviceRoutes'); +app.use('/dns', pubApiDNSRoute); +app.use('/user', pubApiUserRoutes); + +app.use('/api/private/device', authenticate, prtApiDeviceRoutes); app.use('/api/private/tenant', authenticate, prvApiTenantRoute); app.use('/api/private/user', authenticate, prtApiUserRoutes); + const frontendPublic = path.join(__dirname, '../../frontend/public'); const frontendDist = path.join(__dirname, '../../frontend/dist'); app.use('/public', express.static(frontendPublic)); diff --git a/backend/src/routes/private/deviceRoutes.ts b/backend/src/routes/private/deviceRoutes.ts new file mode 100644 index 0000000..9eaa36f --- /dev/null +++ b/backend/src/routes/private/deviceRoutes.ts @@ -0,0 +1,136 @@ +import * as express from 'express'; +import * as HttpStatus from 'http-status-codes'; +import DeviceStore from '../../stores/deviceStore'; + +import { IDevice, ISearchOpt } from '../../interfaces/interfaces'; +const _ = require('lodash'); +const factory = require('../../shared/factory'); +const router = express.Router(); +const deviceStore = new DeviceStore(); + +router.get( + '/', async ( + req: any, + res: express.Response, + next: express.NextFunction + ) => { + const tenant_id = req.query.id; + try { + const deviceResponse = await deviceStore.findById(tenant_id); + if (deviceResponse && deviceResponse.length == 1) { + const device = deviceResponse[0]; + const result = factory.generateSuccessResponse(device, null, "Device found"); + res.status(HttpStatus.OK).send(result); + } else { + const result = factory.generateErrorResponse(null, null, "Device not found"); + res.status(HttpStatus.NOT_FOUND).send(result); + } + } catch (error) { + const result = factory.generateErrorResponse(null, error, "ERROR"); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).send(result); + res.end(); + } + return router; +} +); + +router.get( + '/getAll', async ( + req: express.Request, + res: express.Response, + next: express.NextFunction + ) => { + try { + const options = req.query.options; + const search = req.query.search; + let searchOptions: ISearchOpt = options ? JSON.parse(options) : {}; + searchOptions.itemsPerPage = searchOptions.itemsPerPage || 25; + searchOptions.activePage = searchOptions.activePage || 1; + searchOptions.needle = search || ""; + const devicesRes = await deviceStore.getAll(searchOptions); + + + if (devicesRes && devicesRes.length > 0) { + const result = factory.generateSuccessResponse( + {devices: devicesRes, options: searchOptions}, + null, + 'Devices found' + ); + res.status(HttpStatus.OK).json(result); + } else { + const result = factory.generateSuccessResponse( + null, + null, + 'Devices not found' + ); + res.status(HttpStatus.OK).json(result); + } + } catch (error) { + const result = factory.generateErrorResponse( + null, + error, + 'Devices not found' + ); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(result); + } +} +); + +router.post('/create', async (req, res, next) => { + const device = req.body.params; + try { + const devices = await deviceStore.findBy(device); + let message = ''; + if (!devices || devices.length == 0) { + const resCreation = await deviceStore.create(device); + if (resCreation && resCreation.length == 1) { + message = 'Device successfully created' + const result = factory.generateSuccessResponse(null, null, message); + res.status(HttpStatus.OK).json(result); + } else { + const result = factory.generateErrorResponse(null, null, 'Error'); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(result); + } + } else { + message = 'Device already exists' + const result = factory.generateSuccessResponse(null, null, message); + res.status(HttpStatus.OK).json(result); + } + } catch (error) { + console.log("ERR", error); + const result = factory.generateErrorResponse(null, null, 'Error'); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(result); + } +}); + +router.put('/update', async (req, res, next) => { + const device = req.body.params; + try { + if (!device.id) { + const result = factory.generateErrorResponse(null, null, 'Error'); + res.status(HttpStatus.BAD_REQUEST).json(result); + } + const devices = await deviceStore.findById(device.id); + let message = ''; + if (devices.length == 1) { + const resUpdate = await deviceStore.update(device); + if (resUpdate && resUpdate.length == 1) { + message = 'Device successfully updated' + const result = factory.generateSuccessResponse(null, null, message); + res.status(HttpStatus.OK).json(result); + } else { + const result = factory.generateErrorResponse(null, null, 'Error'); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(result); + } + } else { + message = 'Device not found' + const result = factory.generateSuccessResponse(null, null, message); + res.status(HttpStatus.NOT_FOUND).json(result); + } + } catch (error) { + const result = factory.generateErrorResponse(null, null, 'Error'); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(result); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/backend/src/routes/private/tenantRoutes.ts b/backend/src/routes/private/tenantRoutes.ts index 23c13b7..9dce2da 100644 --- a/backend/src/routes/private/tenantRoutes.ts +++ b/backend/src/routes/private/tenantRoutes.ts @@ -41,7 +41,6 @@ router.get( next: express.NextFunction ) => { try { - console.log("req.query", req.query); const options = req.query.options; const search = req.query.search; let searchOptions: ISearchOpt = options ? JSON.parse(options) : {}; diff --git a/backend/src/stores/deviceStore.ts b/backend/src/stores/deviceStore.ts index feecde0..6ac4b93 100644 --- a/backend/src/stores/deviceStore.ts +++ b/backend/src/stores/deviceStore.ts @@ -1,4 +1,4 @@ -import { IDevice } from '../interfaces/interfaces'; +import { IDevice, ISearchOpt } from '../interfaces/interfaces'; const _ = require('lodash'); const moment = require('moment'); var config = require('../../../backend/knexfile'); @@ -32,4 +32,20 @@ export default class DeviceStore { findAll() { return knex('devices').returning('*'); } + + getAll(options: ISearchOpt) { + return knex.raw(`SELECT * + FROM devices + WHERE description LIKE '%${options.needle}%' + OR edge_interface_name LIKE '%${options.needle}%' + ORDER BY created_at DESC + LIMIT ${options.itemsPerPage} + OFFSET ${(options.itemsPerPage * (options.activePage - 1))}` + ) + .then((data: any) => { + return data; + }).catch((err: any) => { + return err; + }); + } } \ No newline at end of file diff --git a/frontend/src/components/forms/tenantForm.tsx b/frontend/src/components/forms/tenantForm.tsx index d0f20b5..e759733 100644 --- a/frontend/src/components/forms/tenantForm.tsx +++ b/frontend/src/components/forms/tenantForm.tsx @@ -5,7 +5,7 @@ import * as NotificationActions from '../../actions/notificationActions'; import * as UserActions from '../../actions/userActions'; import TenantApi from './../../api/tenantApi'; import DNSBaseComponent from '../dnsBaseComponent'; -import { Grid, Input, Button, Container, Segment, Card, Image, Form } from 'semantic-ui-react'; +import { Grid, Input, Button, Container, Segment, Card, Image, Form, Icon } from 'semantic-ui-react'; import { history } from '../../main'; import _ from 'lodash'; import { ITenant } from '../../../interfaces/tenant'; @@ -21,7 +21,6 @@ interface CompState { edge_interface_name?: string; } - class TenantForm extends DNSBaseComponent { state = { description: '', @@ -85,51 +84,52 @@ class TenantForm extends DNSBaseComponent { render() { return ( - - - - Create Tenant - - -
- - - { - this.handleChange(event); - }} - /> - - - { - this.handleChange(event); - }} - /> - - - - -
-
-
-
+ <> + + + Creazione Tenant +
+ + + { + this.handleChange(event); + }} + /> + + + { + this.handleChange(event); + }} + /> + + + + +
+ ); } }