Skip to content

Commit

Permalink
Merge pull request #185 from Xitija/Shiksha-2.0
Browse files Browse the repository at this point in the history
PS- 707 Update responses for Field APIs
  • Loading branch information
vaivk369 authored May 30, 2024
2 parents 584a94b + 8b0045d commit 0c680ad
Show file tree
Hide file tree
Showing 11 changed files with 85 additions and 86 deletions.
9 changes: 5 additions & 4 deletions src/adapters/fieldsservicelocator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ import { FieldsSearchDto } from "src/fields/dto/fields-search.dto";
import { FieldsDto } from "src/fields/dto/fields.dto";
import { FieldValuesDto } from "src/fields/dto/field-values.dto";
import { FieldValuesSearchDto } from "src/fields/dto/field-values-search.dto";
import { Response } from "express";

export interface IServicelocatorfields {
//fields
createFields(request: any, fieldsDto: FieldsDto);
createFields(request: any, fieldsDto: FieldsDto, response: Response);
// getFields(tenantId, fieldsId, request);
searchFields(tenantid, request: any, fieldsSearchDto: FieldsSearchDto);
searchFields(tenantid, request: any, fieldsSearchDto: FieldsSearchDto,response: Response);
// updateFields(fieldsId: string, request: any, fieldsDto: FieldsDto);
//field values
createFieldValues(request: any, fieldValuesDto: FieldValuesDto,response);
createFieldValues(request: any, fieldValuesDto: FieldValuesDto,response : Response);
// getFieldValues(id, request);
searchFieldValues(request: any, fieldValuesSearchDto: FieldValuesSearchDto);
searchFieldValues(request: any, fieldValuesSearchDto: FieldValuesSearchDto, response: Response);
updateFieldValues(id: string, request: any, fieldValuesDto: FieldValuesDto);
}
3 changes: 2 additions & 1 deletion src/adapters/hasura/userTenantMapping.adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';
import { UserTenantMapping } from 'src/userTenantMapping/entities/user-tenant-mapping.entity';
import { UserTenantMappingDto } from "src/userTenantMapping/dto/user-tenant-mapping.dto";
import { IServicelocatorAssignTenant } from '../usertenantmappinglocator';

@Injectable()
export class HasuraAssignTenantService {
export class HasuraAssignTenantService implements IServicelocatorAssignTenant {
constructor(
@InjectRepository(UserTenantMapping)
private userTenantMappingRepository: Repository<UserTenantMapping>,
Expand Down
65 changes: 32 additions & 33 deletions src/adapters/postgres/fields-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ import { SuccessResponse } from "src/success-response";
import { ErrorResponseTypeOrm } from "src/error-response-typeorm";
import APIResponse from "src/common/responses/response";
import { APIID } from "src/common/utils/api-id.config";
import { IServicelocatorfields } from "../fieldsservicelocator";
import { Response } from "express";

@Injectable()
export class PostgresFieldsService {
export class PostgresFieldsService implements IServicelocatorfields {
constructor(
@InjectRepository(Fields)
private fieldsRepository: Repository<Fields>,
Expand All @@ -24,9 +26,9 @@ export class PostgresFieldsService {
) { }

//fields
async createFields(request: any, fieldsDto: FieldsDto) {
async createFields(request: any, fieldsDto: FieldsDto, response: Response,) {
const apiId = APIID.FIELDS_CREATE;
try {

const fieldsData: any = {}; // Define an empty object to store field data

Object.keys(fieldsDto).forEach((e) => {
Expand All @@ -42,21 +44,18 @@ export class PostgresFieldsService {
});

let result = await this.fieldsRepository.save(fieldsData);
return new SuccessResponse({
statusCode: HttpStatus.CREATED,
message: "Ok.",
data: result,
});

return await APIResponse.success(response, apiId, result,
HttpStatus.CREATED, 'Fields created successfully.')

} catch (e) {
return new ErrorResponseTypeOrm({
statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
errorMessage: e,
});
const errorMessage = e?.message || 'Something went wrong';
return APIResponse.error(response, apiId, "Internal Server Error", `Error : ${errorMessage}`, HttpStatus.INTERNAL_SERVER_ERROR)
}
}

async searchFields(tenantId: string, request: any, fieldsSearchDto: FieldsSearchDto) {
async searchFields(tenantId: string, request: any, fieldsSearchDto: FieldsSearchDto,response :Response) {
const apiId = APIID.FIELDS_SEARCH;
try {

const getConditionalData = await this.search(fieldsSearchDto)
Expand All @@ -67,18 +66,18 @@ export class PostgresFieldsService {
const getFieldValue = await this.searchFieldData(offset, limit, whereClause)


return new SuccessResponse({
statusCode: HttpStatus.OK,
message: 'Ok.',
const result = {
totalCount: getFieldValue.totalCount,
data: getFieldValue.mappedResponse,
});
fields: getFieldValue.mappedResponse,
}

return await APIResponse.success(response, apiId, result,
HttpStatus.OK, 'Fields fetched successfully.')


} catch (e) {
return new ErrorResponseTypeOrm({
statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
errorMessage: e,
});
const errorMessage = e?.message || 'Something went wrong';
return APIResponse.error(response, apiId, "Internal Server Error", `Error : ${errorMessage}`, HttpStatus.INTERNAL_SERVER_ERROR)
}
}

Expand All @@ -102,7 +101,7 @@ export class PostgresFieldsService {
return { mappedResponse, totalCount };
}

async createFieldValues(request: any, fieldValuesDto: FieldValuesDto,res) {
async createFieldValues(request: any, fieldValuesDto: FieldValuesDto,res:Response) {
const apiId = APIID.FIELDVALUES_CREATE;


Expand All @@ -128,7 +127,8 @@ export class PostgresFieldsService {
}
}

async searchFieldValues(request: any, fieldValuesSearchDto: FieldValuesSearchDto) {
async searchFieldValues(request: any, fieldValuesSearchDto: FieldValuesSearchDto, response: Response) {
const apiId = APIID.FIELDVALUES_SEARCH;
try {
const getConditionalData = await this.search(fieldValuesSearchDto)
const offset = getConditionalData.offset;
Expand All @@ -137,18 +137,17 @@ export class PostgresFieldsService {

const getFieldValue = await this.getSearchFieldValueData(offset, limit, whereClause)

return new SuccessResponse({
statusCode: HttpStatus.OK,
message: 'Ok.',
const result = {
totalCount: getFieldValue.totalCount,
data: getFieldValue.mappedResponse,
});
fields: getFieldValue.mappedResponse,
}

return await APIResponse.success(response, apiId, result,
HttpStatus.OK, 'Field Values fetched successfully.')

} catch (e) {
return new ErrorResponseTypeOrm({
statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
errorMessage: e,
});
const errorMessage = e?.message || 'Something went wrong';
return APIResponse.error(response, apiId, "Internal Server Error", `Error : ${errorMessage}`, HttpStatus.INTERNAL_SERVER_ERROR)
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/adapters/postgres/user-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ import { UserData } from 'src/user/user.controller';
import APIResponse from 'src/common/responses/response';
import { Response } from 'express';
import { APIID } from 'src/common/utils/api-id.config';
import { IServicelocator } from '../userservicelocator';

@Injectable()
export class PostgresUserService {
export class PostgresUserService implements IServicelocator {
axios = require("axios");

constructor(
Expand Down
36 changes: 15 additions & 21 deletions src/adapters/postgres/userTenantMapping-adapter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BadRequestException, ConsoleLogger, HttpStatus, Injectable } from '@nestjs/common';
import { HttpStatus, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';
import { UserTenantMapping } from 'src/userTenantMapping/entities/user-tenant-mapping.entity';
Expand All @@ -7,10 +7,13 @@ import { ErrorResponseTypeOrm } from 'src/error-response-typeorm';
import { SuccessResponse } from 'src/success-response';
import { User } from "src/user/entities/user-entity";
import { Tenants } from "src/userTenantMapping/entities/tenant.entity";

import { IServicelocatorAssignTenant } from '../usertenantmappinglocator';
import APIResponse from 'src/common/responses/response';
import { Response } from 'express';
import { APIID } from 'src/common/utils/api-id.config';

@Injectable()
export class PostgresAssignTenantService {
export class PostgresAssignTenantService implements IServicelocatorAssignTenant {
constructor(
@InjectRepository(UserTenantMapping)
private userTenantMappingRepository: Repository<UserTenantMapping>,
Expand Down Expand Up @@ -49,18 +52,15 @@ export class PostgresAssignTenantService {
return true;
}

public async userTenantMapping(request: any, assignTenantMappingDto: UserTenantMappingDto) {
public async userTenantMapping(request: any, assignTenantMappingDto: UserTenantMappingDto, response: Response) {
const apiId = APIID.ASSIGN_TENANT_CREATE;
try {

const userId = assignTenantMappingDto.userId;
const tenantIds = assignTenantMappingDto.tenantId;

// Check if tenant array is not empty
if (!tenantIds || tenantIds.length === 0) {
return new SuccessResponse({
statusCode: HttpStatus.BAD_REQUEST,
message: "Please provide at least one tenant Id",
});
return APIResponse.error(response, apiId, "Bad Request", "Please provide at least one tenant Id", HttpStatus.BAD_REQUEST);
}

let result = [];
Expand All @@ -84,25 +84,19 @@ export class PostgresAssignTenantService {
}

if (result.length == 0) {
return {
statusCode: HttpStatus.BAD_REQUEST,
errorCount: errors.length,
errors,
};
return APIResponse.error(response, apiId, "Bad Request", `User not added to tenants ${JSON.stringify(errors)}`, HttpStatus.BAD_REQUEST);
}
return {
statusCode: HttpStatus.CREATED,
const res = {
successCount: result.length,
errorCount: errors.length,
data: result,
errors,
};

return await APIResponse.success(response, apiId, res ,HttpStatus.OK, "User added to tenants successfully.")
} catch (error) {
return new ErrorResponseTypeOrm({
statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
errorMessage: JSON.stringify(error)
});
const errorMessage = error?.message || 'Something went wrong';
return APIResponse.error(response, apiId, "Internal Server Error", `Error : ${errorMessage}`, HttpStatus.INTERNAL_SERVER_ERROR)
}
}

}
5 changes: 3 additions & 2 deletions src/adapters/usertenantmappinglocator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Response } from "express";
import { UserTenantMappingDto } from "src/userTenantMapping/dto/user-tenant-mapping.dto";
export interface IServicelocatorassignTenant {
userTenantMapping(request: any, assignTenantMappingDto:UserTenantMappingDto);
export interface IServicelocatorAssignTenant {
userTenantMapping(request: any, assignTenantMappingDto: UserTenantMappingDto,response: Response);
}
2 changes: 1 addition & 1 deletion src/common/filters/exception.filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export class AllExceptionsFilter implements ExceptionFilter {
response,
this.apiId,
detailedErrorMessage,
exception instanceof HttpException ? exception.name : 'InternalServerError', // error
exception instanceof HttpException ? exception.name : 'Internal Server Error', // error
status
);
}
Expand Down
6 changes: 5 additions & 1 deletion src/common/utils/api-id.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,9 @@ export const APIID = {
COHORT_READ: "api.cohort.read",
COHORT_UPDATE: "api.cohort.update",
COHORT_DELETE: "api.cohort.delete",
FIELDVALUES_CREATE: "api.fieldValues.create"
ASSIGN_TENANT_CREATE:"api.assigntenant.create",
FIELDS_CREATE: "api.fields.create",
FIELDS_SEARCH:"api.fields.search",
FIELDVALUES_CREATE: "api.fieldValues.create",
FIELDVALUES_SEARCH: "api.fieldValues.search"
}
20 changes: 9 additions & 11 deletions src/fields/fields.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export class FieldsController {

//fields
//create fields
@Post()
@Post("/create")
@ApiBasicAuth("access-token")
@ApiCreatedResponse({ description: "Fields has been created successfully." })
@ApiBody({ type: FieldsDto })
Expand All @@ -62,8 +62,7 @@ export class FieldsController {
tenantId: tenantid,
};
Object.assign(fieldsDto, payload);
const result = await this.fieldsAdapter.buildFieldsAdapter().createFields(request, fieldsDto);
return response.status(result.statusCode).json(result);
return await this.fieldsAdapter.buildFieldsAdapter().createFields(request, fieldsDto, response);
}

//search
Expand All @@ -86,18 +85,18 @@ export class FieldsController {
@Res() response: Response
) {
let tenantid = headers["tenantid"];
const result = await this.fieldsAdapter.buildFieldsAdapter().searchFields(
return await this.fieldsAdapter.buildFieldsAdapter().searchFields(
tenantid,
request,
fieldsSearchDto
fieldsSearchDto,
response
);
return response.status(result.statusCode).json(result);
}

//field values
//create fields values
@UseFilters(new AllExceptionsFilter(APIID.FIELDVALUES_CREATE))
@Post("/values")
@Post("/values/create")
@ApiBasicAuth("access-token")
@ApiCreatedResponse({
description: "Fields Values has been created successfully.",
Expand All @@ -115,7 +114,6 @@ export class FieldsController {
fieldValuesDto,
response
);

}

//search fields values
Expand All @@ -133,10 +131,10 @@ export class FieldsController {
@Body() fieldValuesSearchDto: FieldValuesSearchDto,
@Res() response: Response
) {
const result = await this.fieldsAdapter.buildFieldsAdapter().searchFieldValues(
return await this.fieldsAdapter.buildFieldsAdapter().searchFieldValues(
request,
fieldValuesSearchDto
fieldValuesSearchDto,
response
);
return response.status(result.statusCode).json(result);
}
}
6 changes: 3 additions & 3 deletions src/userTenantMapping/user-tenant-mapping.adapter.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { Injectable } from "@nestjs/common";
import { PostgresAssignTenantService } from "src/adapters/postgres/userTenantMapping-adapter";
import { HasuraAssignTenantService } from "src/adapters/hasura/userTenantMapping.adapter";
import { IServicelocatorassignTenant } from "src/adapters/usertenantmappinglocator";
import { IServicelocatorAssignTenant } from "src/adapters/usertenantmappinglocator";

@Injectable()
export class AssignTenantAdapter {
constructor(private hasuraProvider: HasuraAssignTenantService,
private postgresProvider:PostgresAssignTenantService) {}
buildAssignTenantAdapter(): IServicelocatorassignTenant {
let adapter: IServicelocatorassignTenant;
buildAssignTenantAdapter(): IServicelocatorAssignTenant {
let adapter: IServicelocatorAssignTenant;

switch (process.env.ADAPTERSOURCE) {
case "hasura":
Expand Down
Loading

0 comments on commit 0c680ad

Please sign in to comment.