Skip to content
Snippets Groups Projects
Commit 8e541652 authored by Benguria Elguezabal, Gorka's avatar Benguria Elguezabal, Gorka
Browse files

public release

parents
No related branches found
No related tags found
No related merge requests found
Showing
with 1014 additions and 0 deletions
node_modules
dist
npm-debug.log
\ No newline at end of file
[*.{js,ts}]
indent_style = space
indent_size = 2
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 130
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
sourceType: 'module'
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
root: true,
env: {
node: true,
},
ignorePatterns: ['.eslintrc.js'],
rules: {
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-explicit-any': 'off',
},
};
/node_modules
build
package-lock.json
.env
stages:
- build_and_push
- redeploy
build_and_push:
image: docker/compose:latest
stage: build_and_push
services:
- docker:dind
script:
- docker build -t backend . --tag 094360380/wp5-citizen:web-application-be
- docker login docker.io -u "$DOCKER_REGISTRY_USER" -p "$DOCKER_REGISTRY_PASSWORD"
- docker push 094360380/wp5-citizen:web-application-be
tags:
- docker
only:
- kubernetes
redeploy_at_k8s:
image: alpine/k8s:1.21.5
stage: redeploy
script:
- kubectl config set-cluster local --server="${K8S_SERVER}"
- kubectl config set clusters.local.certificate-authority-data "${K8S_CERTIFICATE_AUTHORITY_DATA}"
- kubectl config set-credentials local --token="${K8S_USER_TOKEN}"
- kubectl config set-context local --cluster=local --user=local
- kubectl config use-context local
- kubectl --insecure-skip-tls-verify version
- kubectl get deployments citizen-app-be -n citizen-application-dev --insecure-skip-tls-verify
- kubectl rollout restart deployment citizen-app-be -n citizen-application-dev --insecure-skip-tls-verify
tags:
- docker
only:
- kubernetes
when: manual
.nvmrc 0 → 100644
v14.18.1
{
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "always",
"endOfLine":"auto",
"tabWidth": 2,
"printWidth": 130
}
FROM node:16
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# Bundle app source
COPY . .
EXPOSE 3090
RUN npm run build
CMD [ "node", "build" ]
# docker build -t across-be .
# docker run -p 3090:3090 --name across-be across-be
\ No newline at end of file
# Keycloak NodeJS
### Create file .crt
Creates the .crt file and copies the RS256 algorithm certificate from the realm you created in keycloak
```
-----BEGIN CERTIFICATE-----
{INSERT_TOKEN_HERE}
-----END CERTIFICATE-----
```
# to run the project
npm run dev
{
"name": "across-be",
"version": "1.0.0",
"author": "Nikolaos Latzonis",
"description": "Across BE",
"scripts": {
"start": "node build",
"build": "tsc",
"dev": "ts-node-dev --respawn --transpile-only --ignore-watch node_modules --no-notify src"
},
"dependencies": {
"@types/jwt-decode": "^3.1.0",
"@types/lodash": "^4.14.191",
"@types/mongoose": "^5.11.97",
"axios": "^1.1.3",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"express-fileupload": "^1.4.0",
"express-session": "^1.17.2",
"form-data": "^4.0.0",
"fs": "0.0.1-security",
"jsonwebtoken": "^9.0.0",
"jwt-decode": "^3.1.2",
"keycloak-connect": "^13.0.1",
"lodash": "^4.17.21",
"mongoose": "^6.8.3",
"morgan": "^1.10.0",
"pusher": "^5.1.3",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^4.6.2",
"winston": "^3.8.2",
"yamljs": "^0.3.0"
},
"devDependencies": {
"@types/cors": "^2.8.10",
"@types/express": "^4.17.12",
"@types/express-fileupload": "^1.4.1",
"@types/express-session": "^1.17.3",
"@types/jsonwebtoken": "^9.0.1",
"@types/morgan": "^1.9.4",
"@types/node": "^15.12.2",
"@types/swagger-jsdoc": "^6.0.1",
"@types/swagger-ui-express": "^4.1.3",
"@types/yamljs": "^0.2.31",
"@typescript-eslint/eslint-plugin": "^5.27.0",
"@typescript-eslint/parser": "^5.27.0",
"eslint": "^8.16.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"prettier": "^2.6.2",
"ts-node-dev": "^1.1.6",
"typescript": "^4.3.2"
}
}
import { Request, Response } from 'express';
import Favorite from '../../schemas/Favorite';
export class FavoriteController {
async getFavorites(_: Request, res: Response) {
try {
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const favorite = await Favorite.findOne({ userId });
const favorites = favorite
? favorite.favorites.map((x) => ({
phaseId: x.phaseId,
actionId: x.actionId,
serviceId: x.serviceId,
workflowInstanceId: x.workflowInstanceId,
}))
: [];
res.status(200).send(favorites).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
async getFavoritesByJourney(req: Request, res: Response) {
try {
const { workflowInstanceId } = req.params;
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const favorite = await Favorite.findOne({ userId });
const favorites = favorite
? favorite.favorites
.filter((y) => y.workflowInstanceId === workflowInstanceId)
.map((x) => ({
phaseId: x.phaseId,
actionId: x.actionId,
serviceId: x.serviceId,
workflowInstanceId: x.workflowInstanceId,
}))
: [];
res.status(200).send(favorites).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
async putFavorite(req: Request, res: Response) {
try {
const { phaseId, actionId, serviceId, workflowInstanceId } = req.params;
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const favorite = await Favorite.findOne({ userId }).exec();
const favorites = favorite ? favorite.favorites : [];
const founded = favorites.find(
(x) =>
x.phaseId === phaseId &&
x.actionId === actionId &&
x.serviceId === serviceId &&
x.workflowInstanceId === workflowInstanceId,
);
const doc = {
userId,
favorites: founded
? favorites.filter(
(x) =>
!(
x.phaseId === phaseId &&
x.actionId === actionId &&
x.serviceId === serviceId &&
x.workflowInstanceId === workflowInstanceId
),
)
: [...favorites, { phaseId, actionId, serviceId, workflowInstanceId }],
};
const dbFavorite = await Favorite.findOneAndUpdate({ userId: doc.userId }, doc, { upsert: true, returnDocument: 'after' });
const dbFavorites = dbFavorite
? dbFavorite.favorites.map((x) => ({
phaseId: x.phaseId,
actionId: x.actionId,
serviceId: x.serviceId,
workflowInstanceId: x.workflowInstanceId,
}))
: [];
res.status(200).send(dbFavorites).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
}
import { Request, Response } from 'express';
import Feedback from '../../schemas/Feedback';
//const LIMIT_FEEDBACKS = 20;
export class FeedbackController {
async getFeedback(_: Request, res: Response) {
try {
//const feedbacks = await Feedback.find().sort({ createdAt: 'desc' }).limit(LIMIT_FEEDBACKS).exec();
const feedbacks = await Feedback.find().sort({ createdAt: 'desc' }).exec();
res.status(200).send(feedbacks).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
async postFeedback(req: Request, res: Response) {
try {
const { origin, purpose, destination, text, userInitials, userFirstName, userSurname, userEmail, approve } = req.body;
const feedback = await Feedback.create({
origin,
purpose,
destination,
text,
userInitials,
userFirstName,
userSurname,
userEmail,
approve,
});
res.status(201).send(feedback).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
async postFeedbackApprovalStatus(req: Request, res: Response) {
try {
const { approve, _id } = req.body;
const updatedData = {
approve: approve,
};
const feedback = await Feedback.findByIdAndUpdate(_id, updatedData, { new: true });
res.status(200).send(feedback).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
}
import { Request, Response } from 'express';
import axios, { AxiosResponse, AxiosError } from 'axios';
import errorHandler from '../../utils/error';
const ujse_api = process.env.UJSE_API;
export class LoggerController {
getUserLogs = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { pageNo, pageSize, workflowInstanceId, phaseId, actionId, serviceId } = req.query;
axios
.get(
`${ujse_api}/logManagement/Paged?pageNo=${pageNo}&pageSize=${pageSize}&workflowInstanceId=${workflowInstanceId}&phaseId=${phaseId}&actionId=${actionId}${
serviceId ? `&serviceId=${serviceId}` : ''
}`,
{
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getStatisticsInfo = (req: Request, res: Response) => {
try {
axios
.get(`${ujse_api}/logManagement/StatisticsInfo`, {
headers: {
Accept: 'application/json',
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
}
import { Request, Response } from 'express';
import Notification from '../../schemas/Notification';
export class NotificationController {
getNotifications = async (_: Request, res: Response) => {
try {
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const notificationsDB = await Notification.find({ userId }).sort({ createdAt: 'desc' });
const notifications =
notificationsDB.map((x) => ({
id: x._id.toString(),
workflowInstanceId: x.workflowInstanceId,
phaseId: x.phaseId,
actionId: x.actionId,
serviceId: x.serviceId,
userId: x.userId,
status: x.status,
createdAt: x.createdAt,
url: x.url,
})) || [];
res.status(200).send(notifications).end();
} catch (err) {
res.status(400).send({ message: err.message }).end();
}
};
deleteNotification = async (req: Request, res: Response) => {
try {
const { decoded } = res.locals;
const { id } = req.params;
const userId = decoded.sub.toString();
const notification = await Notification.findOne({ userId, _id: id });
if (notification) {
await Notification.deleteOne({ _id: id });
res.status(200).end();
} else {
res.status(404).end({ message: 'Not found.' });
}
} catch (err) {
res.status(400).send({ message: err.message }).end();
}
};
}
import axios, { AxiosError, AxiosResponse } from 'axios';
import { Request, Response } from 'express';
import errorHandler from '../../utils/error';
const sc_api = process.env.SC_API;
export class ServiceCatalogueController {
getEstimatedCostPerService = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { serviceId } = req.query;
axios
.get(`${sc_api}/service-catalogue/api/v2/services/cost?serviceId=${serviceId}`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
const send = data.length ? data.pop() : data;
res.status(status).send(send).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getEstimatedTimePerService = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { serviceId } = req.query;
axios
.get(`${sc_api}/service-catalogue/api/v2/services/time?serviceId=${serviceId}`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getServiceMetadata = (req: Request, res: Response) => {
try {
const { serviceId } = req.query;
axios
.get(`${sc_api}/service-catalogue/api/v2/services/json/**?identifier=${serviceId}`, {
headers: {
Accept: 'application/json',
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getServiceCount = (req: Request, res: Response) => {
try {
axios
.get(`${sc_api}/service-catalogue/api/v2/services/count`, {
headers: {
Accept: 'application/json',
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getServices = (req: Request, res: Response) => {
try {
axios
.get(`${sc_api}/service-catalogue/api/v2/services`, {
headers: {
Accept: 'application/json',
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
}
import axios, { AxiosError, AxiosResponse } from 'axios';
import { Request, Response } from 'express';
import { JwtPayload } from 'jsonwebtoken';
import { IProvider } from '../../interfaces/IProvider';
import { isStatus, IStatus } from '../../interfaces/IStatus';
import errorHandler from '../../utils/error';
import utils from '../../utils/utils';
import logger from '../../logger';
import pusher from '../../pusher';
import Notification from '../../schemas/Notification';
const ujse_api = process.env.UJSE_API;
export class StatusController {
updateStatus = (req: Request & JwtPayload & IProvider, res: Response) => {
try {
const { provider } = req;
const { status: statusController, url }: { status: IStatus; url: string } = req.body;
if (!statusController || !isStatus(statusController)) {
return res.status(400).send({ message: 'Bad request' }).end();
}
const { workflowInstanceId, phaseId, actionId, serviceId, userId } = provider as IProvider;
const providerToken = utils.generateProviderToken(
`${workflowInstanceId}`,
`${phaseId}`,
`${actionId}`,
`${serviceId}`,
`${userId}`,
);
axios
.put(
`${ujse_api}/workflowExecutionManagement/setServiceStatusAsynchronous?token=${providerToken}&status=${statusController}&serviceOutput=${url}`,
{
headers: {
Accept: 'application/json',
},
},
)
.then((response: AxiosResponse) => {
//TODO: Don't wait for Engine response to give notification. If this fails, the user will never see the update. Sent the request independently.
const { data, status } = response;
const message = {
workflowInstanceId,
phaseId,
actionId,
serviceId,
userId,
status: statusController,
url,
};
this.saveAndSendNotification(message);
res
.status(status)
.send({ ...data, userId })
.end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(400).send({ message: err.message }).end();
}
};
saveAndSendNotification = async (message: IProvider & { status: IStatus }) => {
const dbMessage = await Notification.create(message);
const { workflowInstanceId, phaseId, actionId, serviceId, userId, status, createdAt, _id: id, url } = dbMessage;
const msg = { workflowInstanceId, phaseId, actionId, serviceId, userId, status, createdAt, id: id.toString(), url };
pusher
.trigger(`${process.env.PUSHER_CHANNEL}`, `${message.userId}`, msg)
.then(() => logger.info(`Successfully sent message to ${msg.userId}...`))
.catch((error) => logger.error('Error sending message:', error));
};
}
import axios, { AxiosError, AxiosResponse } from 'axios';
import { Request, Response } from 'express';
import errorHandler from '../../utils/error';
const trsp_api = process.env.TRSP_API;
export class TransparencyController {
postRemoteConsent = (req: Request, res: Response) => {
try {
const { token, decoded } = res.locals;
const data = {
userId: decoded.sub.toString(),
externalConsentServices: req.body,
};
axios
.post(`${trsp_api}/api/rest/v1/consent/external-consents`, data, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
}
import { Request, Response } from 'express';
import Profile from '../../schemas/Profile';
export class UserProfileController {
async getUserProfile(_: Request, res: Response) {
try {
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const userProfile = await Profile.findOne({ userId }).exec();
res.status(200).send(userProfile).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
async postUserProfile(req: Request, res: Response) {
try {
const { decoded } = res.locals;
const userId = decoded.sub.toString();
const data = { ...req.body, userId };
await Profile.deleteOne({ userId });
const profile = await Profile.create(data);
res.status(201).send(profile).end();
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
}
}
import { Request, Response } from 'express';
import axios, { AxiosResponse, AxiosError } from 'axios';
import errorHandler from '../../utils/error';
import { removeFavorites } from '../services/favorite.service';
import utils from '../../utils/utils';
import FormData from 'form-data';
import fs from 'fs';
import { UploadedFile } from 'express-fileupload';
const ujse_api = process.env.UJSE_API;
export class WorkflowExecutionManagementController {
createUserWorkflowInstance = (req: Request, res: Response) => {
try {
const { token, decoded } = res.locals;
const { countryOrigin, countryDestination, workflowType } = req.body;
const userId = decoded.sub.toString();
axios
.post(
`${ujse_api}/workflowExecutionManagement/createUserWorkflowInstance?userId=${userId}&countryOrigin=${countryOrigin}&countryDestination=${countryDestination}&workflowType=${workflowType}`,
{},
{
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => {
errorHandler(error, res);
});
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getUserWorkflowInstances = (req: Request, res: Response) => {
try {
const { token } = res.locals;
axios
.get(`${ujse_api}/workflowExecutionManagement/getUserWorkflowsInstances`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getStepInfo = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { data } = req.body;
const { workflowInstanceId, stepId } = data;
axios
.get(`${ujse_api}/workflowExecutionManagement/getStepInfo?workflowInstanceId=${workflowInstanceId}&stepId=${stepId}`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getWorkflowByID = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { workflowInstanceId } = req.query;
axios
.get(`${ujse_api}/workflowExecutionManagement/getUserWorkflowInstanceById?workflowInstanceId=${workflowInstanceId}`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data: resp, status } = response;
const data = resp.length ? resp.pop() : null;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
executeStepId = (req: Request, res: Response) => {
res.send().end();
};
getAllWorkflowInstances = (req: Request, res: Response) => {
try {
const { token } = res.locals;
axios
.get(`${ujse_api}/workflowManagement`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getAllWorkflowsForStatistics = (req: Request, res: Response) => {
try {
axios
.get(`${ujse_api}/workflowManagement`, {
headers: {
Accept: 'application/json',
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
deleteWorkflowInstance = (req: Request, res: Response) => {
try {
const { token, decoded } = res.locals;
const { id: workflowInstanceId } = req.params;
removeFavorites(decoded.sub.toString(), workflowInstanceId);
axios
.delete(`${ujse_api}/workflowExecutionManagement/${workflowInstanceId}`, {
headers: {
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
editWorkflowInstance = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { workflowInstanceId, name } = req.query;
axios
.put(
`${ujse_api}/workflowExecutionManagement/workflowName?workflowInstanceId=${workflowInstanceId}&name=${name}`,
{},
{
headers: {
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
finishWorkflowInstance = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { workflowInstanceId } = req.query;
axios
.put(
`${ujse_api}/workflowExecutionManagement/setWorkflowStatus?workflowInstanceId=${workflowInstanceId}&status=finished`,
{},
{
headers: {
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
getServiceInfo = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { serviceId } = req.query;
axios
.get(`${ujse_api}/workflowExecutionManagement/getServiceInfo?serviceId=${serviceId}`, {
headers: {
Authorization: `Bearer ${token}`,
},
})
.then((response: AxiosResponse) => {
const { data, status } = response;
res
.status(status)
.send({ serviceId, ...data })
.end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
setActionStatus = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { workflowInstanceId, phaseId, actionId, status } = req.query;
axios
.put(
`${ujse_api}/workflowExecutionManagement/setActionStatus?workflowInstanceId=${workflowInstanceId}&phaseId=${phaseId}&actionId=${actionId}&status=${status}`,
{},
{
headers: {
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
setServiceStatus = (req: Request, res: Response) => {
try {
const { token } = res.locals;
const { workflowInstanceId, phaseId, actionId, serviceId, status } = req.query;
axios
.put(
`${ujse_api}/workflowExecutionManagement/setServiceStatus?workflowInstanceId=${workflowInstanceId}&phaseId=${phaseId}&actionId=${actionId}&serviceId=${serviceId}&status=${status}`,
{},
{
headers: {
Authorization: `Bearer ${token}`,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
executeService = (req: Request, res: Response) => {
try {
const { token, decoded } = res.locals;
const userId = decoded.sub.toString() as string;
const { workflowInstanceId, phaseId, actionId, serviceId } = req.query;
const data: { [key: string]: string } = req.body;
const files = req?.files;
const inputData = new FormData();
if (files) {
for (const fileName in files) {
const input = files && (files[fileName] as UploadedFile);
inputData.append('inputData', input.data, { filename: fileName, contentType: input.mimetype });
}
}
Object.entries(data).forEach(([key, value]) => {
inputData.append('inputData', value, { filename: key });
});
const providerToken = utils.generateProviderToken(
`${workflowInstanceId}`,
`${phaseId}`,
`${actionId}`,
`${serviceId}`,
userId,
);
const headers = inputData.getHeaders();
axios
.post(
`${ujse_api}/workflowExecutionManagement/executeService?workflowInstanceId=${workflowInstanceId}&phaseId=${phaseId}&actionId=${actionId}&serviceId=${serviceId}&token=${providerToken}`,
inputData,
{
headers: {
Authorization: `Bearer ${token}`,
...headers,
},
},
)
.then((response: AxiosResponse) => {
const { data, status } = response;
//store serviceOutput in UJSE
if (data?.outputData?.length > 0) {
const urlTypeOutput = data.outputData.find((output: { type: string; content: string }) => output.type === 'url');
if (urlTypeOutput) {
const decodedUrl = Buffer.from(urlTypeOutput.content, 'base64').toString('utf-8');
axios
.put(
`${ujse_api}/workflowExecutionManagement/setServiceStatusAsynchronous?token=${providerToken}&status=${data.stepStatus}&serviceOutput=${decodedUrl}`,
{
headers: {
Accept: 'application/json',
},
},
)
.then(() => {
console.log('Synchronous service output url has been successfully stored in UJSE for user:', userId);
})
.catch(() => console.log('Synchronous service output url has failed to be stored in UJSE for user:', userId));
}
}
res.status(status).send(data).end();
})
.catch((error: AxiosError) => errorHandler(error, res));
} catch (err) {
res.status(500).send({ message: err.toString() }).end();
}
};
}
import { NextFunction, Request, Response } from 'express';
import jwt_decode, { JwtPayload } from 'jwt-decode';
const authenticate = (req: Request, res: Response, next: NextFunction) => {
const token =
req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer'
? req.headers.authorization.split(' ')[1]
: '';
const decoded = jwt_decode<JwtPayload>(token);
if (!decoded || typeof decoded === 'string' || !decoded.sub) {
return res
.status(500)
.send({
message: 'Unauthorized!',
})
.end();
}
res.locals.token = token;
res.locals.decoded = decoded;
next();
};
export default authenticate;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment