Adding updateEmployeeEx
All checks were successful
Deploy FitLien services to Dev / Deploy to Dev (push) Successful in 4m14s
All checks were successful
Deploy FitLien services to Dev / Deploy to Dev (push) Successful in 4m14s
This commit is contained in:
parent
09068fe731
commit
bb3e966daf
@ -9,6 +9,23 @@ import { DOMParser } from 'xmldom';
|
|||||||
const logger = getLogger();
|
const logger = getLogger();
|
||||||
const corsHandler = getCorsHandler();
|
const corsHandler = getCorsHandler();
|
||||||
|
|
||||||
|
export interface GetEmployeeDetailsRquest {
|
||||||
|
employeeCode: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UpdateEmployeeExRequest {
|
||||||
|
employeeCode: string;
|
||||||
|
employeeName: string;
|
||||||
|
employeeLocation: string;
|
||||||
|
employeeRole: string;
|
||||||
|
employeeVerificationType: string;
|
||||||
|
employeeExpiryFrom: string;
|
||||||
|
employeeExpiryTo: string;
|
||||||
|
employeeCardNumber: string;
|
||||||
|
groupId: string;
|
||||||
|
employeePhoto: string;
|
||||||
|
}
|
||||||
|
|
||||||
const escapeXml = (str: string) => {
|
const escapeXml = (str: string) => {
|
||||||
return str
|
return str
|
||||||
.replace(/&/g, '&')
|
.replace(/&/g, '&')
|
||||||
@ -102,6 +119,52 @@ function parseGetEmployeeDetailsResponse(soapResponse: string): DoorAccessUser {
|
|||||||
return userDetails;
|
return userDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isValidDateString(dateString: string): boolean {
|
||||||
|
const dateRegex = /^\d{4}\-\d{2}\-\d{2}$/;
|
||||||
|
return dateRegex.test(dateString);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createUpdateEmployeeExRequest(username: string, password: string, request: UpdateEmployeeExRequest) {
|
||||||
|
|
||||||
|
if (!username || !password || !request.employeeCode || !request.employeeName || !request.employeeLocation) {
|
||||||
|
throw new Error('Missing required fields');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValidDateString(request.employeeExpiryFrom) || !isValidDateString(request.employeeExpiryTo)) {
|
||||||
|
throw new Error('Invalid date format');
|
||||||
|
}
|
||||||
|
|
||||||
|
const soapRequest = `<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
|
||||||
|
<soap12:Body>
|
||||||
|
<UpdateEmployeeEx xmlns="http://tempuri.org/">
|
||||||
|
<UserName>${escapeXml(username)}</UserName>
|
||||||
|
<Password>${escapeXml(password)}</Password>
|
||||||
|
<EmployeeCode>${escapeXml(request.employeeCode)}</EmployeeCode>
|
||||||
|
<EmployeeName>${escapeXml(request.employeeName)}</EmployeeName>
|
||||||
|
<EmployeeLocation>${escapeXml(request.employeeLocation)}</EmployeeLocation>
|
||||||
|
<EmployeeRole>${escapeXml(request.employeeRole)}</EmployeeRole>
|
||||||
|
<EmployeeVerificationType>Card</EmployeeVerificationType>
|
||||||
|
<EmployeeExpiryFrom>${escapeXml(request.employeeExpiryFrom)}</EmployeeExpiryFrom>
|
||||||
|
<EmployeeExpiryTo>${escapeXml(request.employeeExpiryTo)}</EmployeeExpiryTo>
|
||||||
|
<EmployeeCardNumber>${escapeXml(request.employeeCardNumber)}</EmployeeCardNumber>
|
||||||
|
<GroupId></GroupId>
|
||||||
|
<EmployeePhoto></EmployeePhoto>
|
||||||
|
</UpdateEmployeeEx>
|
||||||
|
</soap12:Body>
|
||||||
|
</soap12:Envelope>
|
||||||
|
`;
|
||||||
|
return soapRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseUpdateEmployeeExResponse(soapResponse: string): string | null {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const xmlDoc = parser.parseFromString(soapResponse, "text/xml");
|
||||||
|
const currentElement = xmlDoc.documentElement.firstChild as HTMLElement;
|
||||||
|
const resultText = currentElement.textContent;
|
||||||
|
return resultText;
|
||||||
|
}
|
||||||
|
|
||||||
async function sendSoapRequest(soapRequest: string, endpoint: string) {
|
async function sendSoapRequest(soapRequest: string, endpoint: string) {
|
||||||
try {
|
try {
|
||||||
const headers: any = {
|
const headers: any = {
|
||||||
@ -134,24 +197,63 @@ async function getUserDetails(username: string,
|
|||||||
return parsedResponse;
|
return parsedResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function updateEmployeeEx(username: string,
|
||||||
|
password: string,
|
||||||
|
request: UpdateEmployeeExRequest,
|
||||||
|
endpoint: string) {
|
||||||
|
const soapRequest = createUpdateEmployeeExRequest(username, password, request);
|
||||||
|
const soapResponse = await sendSoapRequest(soapRequest, endpoint);
|
||||||
|
const parsedResponse = parseUpdateEmployeeExResponse(soapResponse);
|
||||||
|
return parsedResponse;
|
||||||
|
}
|
||||||
|
|
||||||
export const esslGetUserDetails = onRequest({
|
export const esslGetUserDetails = onRequest({
|
||||||
region: '#{SERVICES_RGN}#'
|
region: '#{SERVICES_RGN}#'
|
||||||
}, async (request: Request, response: Response) => {
|
}, async (request: Request, response: Response) => {
|
||||||
return corsHandler(request, response, async () => {
|
return corsHandler(request, response, async () => {
|
||||||
try {
|
try {
|
||||||
const username = request.body.username;
|
let username: string | null = request.body.username as string;
|
||||||
const password = request.body.password;
|
let password: string | null = request.body.password as string;
|
||||||
const employeeCode = request.body.employeeCode;
|
let endpoint: string | null = request.body.endpoint as string;
|
||||||
const endpoint = request.body.endpoint;
|
let gymId: string | null = request.body.gymId as string;
|
||||||
if ((!username) || (!password)) {
|
|
||||||
|
const getEmployeeDetailsRequest = request.body.params as GetEmployeeDetailsRquest;
|
||||||
|
|
||||||
|
if (!username) {
|
||||||
throw new Error('Missing username or password');
|
throw new Error('Missing username or password');
|
||||||
}
|
}
|
||||||
|
username = username.trim();
|
||||||
|
if (!password) {
|
||||||
|
if (!gymId) {
|
||||||
|
throw new Error('Missing password or gymId');
|
||||||
|
}
|
||||||
|
// todo: Get password from gym configuration by decrypting with private key
|
||||||
|
}
|
||||||
|
password = password.trim();
|
||||||
|
if (!getEmployeeDetailsRequest) {
|
||||||
|
throw new Error('Missing request params');
|
||||||
|
}
|
||||||
|
const employeeCode = getEmployeeDetailsRequest.employeeCode;
|
||||||
if (!employeeCode) {
|
if (!employeeCode) {
|
||||||
throw new Error('Missing employee code');
|
throw new Error('Missing employeeCode');
|
||||||
}
|
}
|
||||||
if (!endpoint) {
|
if (!endpoint) {
|
||||||
throw new Error('Missing endpoint');
|
throw new Error('Missing endpoint');
|
||||||
}
|
}
|
||||||
|
if (!endpoint || endpoint.trim() === '') {
|
||||||
|
throw new Error('Missing endpoint');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
new URL(endpoint);
|
||||||
|
} catch (_) {
|
||||||
|
throw new Error('Endpoint is not a valid URI or URL');
|
||||||
|
}
|
||||||
|
if (!endpoint.endsWith('/webservice.asmx')) {
|
||||||
|
if (endpoint.endsWith('/')) {
|
||||||
|
endpoint = endpoint.substring(0, endpoint.length - 1);
|
||||||
|
}
|
||||||
|
endpoint += '/webservice.asmx';
|
||||||
|
}
|
||||||
const userDetails = await getUserDetails(username, password, employeeCode, endpoint);
|
const userDetails = await getUserDetails(username, password, employeeCode, endpoint);
|
||||||
response.send(userDetails);
|
response.send(userDetails);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@ -160,3 +262,54 @@ export const esslGetUserDetails = onRequest({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const esslUpdateUser = onRequest({
|
||||||
|
region: '#{SERVICES_RGN}#'
|
||||||
|
}, async (request: Request, response: Response) => {
|
||||||
|
return corsHandler(request, response, async () => {
|
||||||
|
try {
|
||||||
|
let username: string | null = request.body.username as string;
|
||||||
|
let password: string | null = request.body.password as string;
|
||||||
|
let endpoint: string | null = request.body.endpoint as string;
|
||||||
|
let gymId: string | null = request.body.gymId as string;
|
||||||
|
|
||||||
|
const updateEmployeeExRequest = request.body.params as UpdateEmployeeExRequest;
|
||||||
|
if (!username) {
|
||||||
|
throw new Error('Missing username or password');
|
||||||
|
}
|
||||||
|
username = username.trim();
|
||||||
|
if (!password) {
|
||||||
|
if (!gymId) {
|
||||||
|
throw new Error('Missing password or gymId');
|
||||||
|
}
|
||||||
|
// todo: Get password from gym configuration by decrypting with private key
|
||||||
|
}
|
||||||
|
if (!endpoint) {
|
||||||
|
throw new Error('Missing endpoint');
|
||||||
|
}
|
||||||
|
endpoint = endpoint.trim();
|
||||||
|
if (!endpoint || endpoint.trim() === '') {
|
||||||
|
throw new Error('Missing endpoint');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
new URL(endpoint);
|
||||||
|
} catch (_) {
|
||||||
|
throw new Error('Endpoint is not a valid URI or URL');
|
||||||
|
}
|
||||||
|
if (!endpoint.endsWith('/webservice.asmx')) {
|
||||||
|
if (endpoint.endsWith('/')) {
|
||||||
|
endpoint = endpoint.substring(0, endpoint.length - 1);
|
||||||
|
}
|
||||||
|
endpoint += '/webservice.asmx';
|
||||||
|
}
|
||||||
|
if (!updateEmployeeExRequest) {
|
||||||
|
throw new Error('Missing request params');
|
||||||
|
}
|
||||||
|
const result = await updateEmployeeEx(username, password, updateEmployeeExRequest, endpoint);
|
||||||
|
response.send(result);
|
||||||
|
} catch (error: any) {
|
||||||
|
logger.error(error);
|
||||||
|
response.status(500).send({ error: error.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export { esslGetUserDetails } from './essl';
|
export { esslGetUserDetails, esslUpdateUser } from './essl';
|
||||||
@ -136,7 +136,7 @@ async function downloadFileFromUrl(url: string): Promise<Buffer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const sendEmailSES = onRequest({
|
export const sendEmailSES = onRequest({
|
||||||
region: 'asia-south1'
|
region: '#{SERVICES_RGN}#'
|
||||||
}, (request: Request, response: Response) => {
|
}, (request: Request, response: Response) => {
|
||||||
return corsHandler(request, response, async () => {
|
return corsHandler(request, response, async () => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -17,4 +17,4 @@ export { processNotificationOnCreate } from './notifications';
|
|||||||
export * from './payments';
|
export * from './payments';
|
||||||
export { getPlaceDetails, getPlacesAutocomplete } from './places';
|
export { getPlaceDetails, getPlacesAutocomplete } from './places';
|
||||||
export { registerClient } from './users';
|
export { registerClient } from './users';
|
||||||
export { esslGetUserDetails } from './dooraccess';
|
export { esslGetUserDetails, esslUpdateUser } from './dooraccess';
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user