From d8b91dcd6aff0e4e2eb874f7faca40983bc59675 Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 09:30:05 -0400 Subject: [PATCH 01/11] empty commit From 3d131ec888bdbaca2140f8987a67e795342b7ec6 Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 10:40:17 -0400 Subject: [PATCH 02/11] renamed app-service files --- src/app/app-context.ts | 15 +- .../blob-storage/index.ts | 6 +- .../cognitive-search/index.ts | 4 +- .../application-services/datastore/index.ts | 14 +- src/app/application-services/index.ts | 54 +++--- ...ty.application-service.ts => community.ts} | 6 +- .../blob-storage/index.ts | 6 +- ...ember.application-service.ts => member.ts} | 4 +- ...rty.application-service.ts => property.ts} | 6 +- .../domain/community.ts | 2 +- .../domain/member.ts | 8 +- .../domain/property.ts | 6 +- src/application-services-impl/domain/role.ts | 4 +- .../domain/service-ticket.ts | 26 +-- .../domain/service.ts | 2 +- .../cosmos-db/communities copy.ts | 159 ++++++++++++++++++ src/graphql/data-sources/cosmos-db/index.ts | 4 +- .../data-sources/data-source-builder.ts | 10 +- src/graphql/data-sources/data-source.ts | 4 + src/graphql/graphql-context.ts | 6 - src/startup/application-services-builder.ts | 72 ++++---- 21 files changed, 284 insertions(+), 134 deletions(-) rename src/application-services-impl/blob-storage/{community.application-service.ts => community.ts} (97%) rename src/application-services-impl/blob-storage/{member.application-service.ts => member.ts} (97%) rename src/application-services-impl/blob-storage/{property.application-service.ts => property.ts} (97%) create mode 100644 src/graphql/data-sources/cosmos-db/communities copy.ts diff --git a/src/app/app-context.ts b/src/app/app-context.ts index 24765394..53804db7 100644 --- a/src/app/app-context.ts +++ b/src/app/app-context.ts @@ -34,12 +34,10 @@ export class AppContextImpl implements AppContext { constructor( verifiedUser: VerifiedUser, communityHeader: string, - // applicationServices: ApplicationServices, infrastructureServices: InfrastructureServices ) { this._verifiedUser = verifiedUser; this._communityHeader = communityHeader; - // this._applicationServices = applicationServices; this._applicationServices = new ApplicationServicesBuilder(this); this._infrastructureServices = infrastructureServices; } @@ -65,11 +63,11 @@ export class AppContextImpl implements AppContext { } async init(): Promise { - console.log(' initializing app context ...') await this.setDefaultPassport(); await this.setCommunityData(); await this.setPassport(); await this.initializeDomain(); + console.log('AppContext initialized...'); } private async initializeDomain() { @@ -87,24 +85,19 @@ export class AppContextImpl implements AppContext { } private async setCommunityData(): Promise{ - console.log(' == ERROR == communityHeader: ', this._communityHeader); if (this._communityHeader) { - this._communityData = await this._applicationServices.communityDataApi.getCommunityByHeader(this._communityHeader); + this._communityData = await this._applicationServices.communityDatastoreApi.getCommunityByHeader(this._communityHeader); } - console.log(' == ERROR == communityData: ', this._communityData); - // this._communityData = null; } private async setPassport(): Promise { let userExternalId = this._verifiedUser.verifiedJWT.sub; if(userExternalId && this._communityData) { - let userData = await this._applicationServices.userDataApi.getByExternalId(userExternalId); - let memberData = await this._applicationServices.memberDataApi.getMemberByCommunityAccountWithCommunityAccountRole(this._communityData.id, userData.id); + let userData = await this._applicationServices.userDatastoreApi.getByExternalId(userExternalId); + let memberData = await this._applicationServices.memberDatastoreApi.getMemberByCommunityAccountWithCommunityAccountRole(this._communityData.id, userData.id); if(memberData && userData) { this._passport = new PassportImpl(userData as UserEntityReference, memberData as MemberEntityReference, this._communityData as CommunityEntityReference); } } - // console.log(' == ERROR == verifiedUser: ', this._verifiedUser, ' community: ', this._communityData); - // this._passport = ReadOnlyPassport.GetInstance(); } } \ No newline at end of file diff --git a/src/app/application-services/blob-storage/index.ts b/src/app/application-services/blob-storage/index.ts index e611599d..d07ed657 100644 --- a/src/app/application-services/blob-storage/index.ts +++ b/src/app/application-services/blob-storage/index.ts @@ -3,7 +3,7 @@ import { MemberBlobStorageApplicationService } from './member.interface'; import { PropertyBlobStorageApplicationService } from './property.interface'; export { - CommunityBlobStorageApplicationService as CommunityBlobAPI, - MemberBlobStorageApplicationService as MemberBlobAPI, - PropertyBlobStorageApplicationService as PropertyBlobAPI, + CommunityBlobStorageApplicationService as CommunityBlobStorageAPI, + MemberBlobStorageApplicationService as MemberBlobStorageAPI, + PropertyBlobStorageApplicationService as PropertyBlobStorageAPI, } \ No newline at end of file diff --git a/src/app/application-services/cognitive-search/index.ts b/src/app/application-services/cognitive-search/index.ts index 2b24879b..768b4ab7 100644 --- a/src/app/application-services/cognitive-search/index.ts +++ b/src/app/application-services/cognitive-search/index.ts @@ -2,6 +2,6 @@ import { PropertyCognitiveSearchApplicationService } from './property.interface' import { ServiceTicketCognitiveSearchApplicationService } from './service-ticket.interface'; export { - PropertyCognitiveSearchApplicationService as PropertySearchAPI, - ServiceTicketCognitiveSearchApplicationService as ServiceTicketSearchAPI + PropertyCognitiveSearchApplicationService as PropertyCognitiveSearchAPI, + ServiceTicketCognitiveSearchApplicationService as ServiceTicketCognitiveSearchAPI } \ No newline at end of file diff --git a/src/app/application-services/datastore/index.ts b/src/app/application-services/datastore/index.ts index 2aeadb82..157cc629 100644 --- a/src/app/application-services/datastore/index.ts +++ b/src/app/application-services/datastore/index.ts @@ -21,18 +21,18 @@ import { ServiceTicketDatastoreApplicationService } from './service-ticket.inter import { ServiceTicketDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/service-ticket'; export { - UserDatastoreApplicationService as UserDataAPI, + UserDatastoreApplicationService as UserDatastoreAPI, UserDataStructure, - CommunityDatastoreApplicationService as CommunityDataAPI, + CommunityDatastoreApplicationService as CommunityDatastoreAPI, CommunityDataStructure, - MemberDatastoreApplicationService as MemberDataAPI, + MemberDatastoreApplicationService as MemberDatastoreAPI, MemberDataStructure, - RoleDatastoreApplicationService as RoleDataAPI, + RoleDatastoreApplicationService as RoleDatastoreAPI, RoleDataStructure, - PropertyDatastoreApplicationService as PropertyDataAPI, + PropertyDatastoreApplicationService as PropertyDatastoreAPI, PropertyDataStructure, - ServiceDatastoreApplicationService as ServiceDataAPI, + ServiceDatastoreApplicationService as ServiceDatastoreAPI, ServiceDataStructure, - ServiceTicketDatastoreApplicationService as ServiceTicketDataAPI, + ServiceTicketDatastoreApplicationService as ServiceTicketDatastoreAPI, ServiceTicketDataStructure, } \ No newline at end of file diff --git a/src/app/application-services/index.ts b/src/app/application-services/index.ts index 835952bd..c00525d9 100644 --- a/src/app/application-services/index.ts +++ b/src/app/application-services/index.ts @@ -1,23 +1,23 @@ -import { CommunityBlobAPI, MemberBlobAPI, PropertyBlobAPI } from "./blob-storage" -import { PropertySearchAPI, ServiceTicketSearchAPI } from "./cognitive-search"; -import { CommunityDataAPI, MemberDataAPI, PropertyDataAPI, RoleDataAPI, ServiceDataAPI, ServiceTicketDataAPI, UserDataAPI } from "./datastore"; +import { CommunityBlobStorageAPI, MemberBlobStorageAPI, PropertyBlobStorageAPI } from "./blob-storage" +import { PropertyCognitiveSearchAPI, ServiceTicketCognitiveSearchAPI } from "./cognitive-search"; +import { CommunityDatastoreAPI, MemberDatastoreAPI, PropertyDatastoreAPI, RoleDatastoreAPI, ServiceDatastoreAPI, ServiceTicketDatastoreAPI, UserDatastoreAPI } from "./datastore"; import { CommunityDomainAPI, MemberDomainAPI, PropertyDomainAPI, RoleDomainAPI, ServiceDomainAPI, ServiceTicketDomainAPI, UserDomainAPI } from "./domain"; import { PropertyMapsAPI } from "./maps"; import { CommunityVercelAPI } from "./vercel"; export interface ApplicationServices { - communityBlobApi: CommunityBlobAPI; - memberBlobApi: MemberBlobAPI; - propertyBlobApi: PropertyBlobAPI; - propertySearchApi: PropertySearchAPI; - serviceTicketSearchApi: ServiceTicketSearchAPI; - userDataApi: UserDataAPI; - roleDataApi: RoleDataAPI; - serviceDataApi: ServiceDataAPI; - serviceTicketDataApi: ServiceTicketDataAPI; - memberDataApi: MemberDataAPI; - communityDataApi: CommunityDataAPI; - propertyDataApi: PropertyDataAPI; + communityBlobStorageApi: CommunityBlobStorageAPI; + memberBlobStorageApi: MemberBlobStorageAPI; + propertyBlobStorageApi: PropertyBlobStorageAPI; + propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; + serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; + userDatastoreApi: UserDatastoreAPI; + roleDatastoreApi: RoleDatastoreAPI; + serviceDatastoreApi: ServiceDatastoreAPI; + serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; + memberDatastoreApi: MemberDatastoreAPI; + communityDatastoreApi: CommunityDatastoreAPI; + propertyDatastoreApi: PropertyDatastoreAPI; userDomainApi: UserDomainAPI; communityDomainApi: CommunityDomainAPI; memberDomainApi: MemberDomainAPI; @@ -30,18 +30,18 @@ export interface ApplicationServices { } export { - CommunityBlobAPI, - MemberBlobAPI, - PropertyBlobAPI, - PropertySearchAPI, - ServiceTicketSearchAPI, - UserDataAPI, - RoleDataAPI, - ServiceDataAPI, - ServiceTicketDataAPI, - MemberDataAPI, - CommunityDataAPI, - PropertyDataAPI, + CommunityBlobStorageAPI, + MemberBlobStorageAPI, + PropertyBlobStorageAPI, + PropertyCognitiveSearchAPI, + ServiceTicketCognitiveSearchAPI, + UserDatastoreAPI, + RoleDatastoreAPI, + ServiceDatastoreAPI, + ServiceTicketDatastoreAPI, + MemberDatastoreAPI, + CommunityDatastoreAPI, + PropertyDatastoreAPI, UserDomainAPI, CommunityDomainAPI, MemberDomainAPI, diff --git a/src/application-services-impl/blob-storage/community.application-service.ts b/src/application-services-impl/blob-storage/community.ts similarity index 97% rename from src/application-services-impl/blob-storage/community.application-service.ts rename to src/application-services-impl/blob-storage/community.ts index 3a719483..6437fab5 100644 --- a/src/application-services-impl/blob-storage/community.application-service.ts +++ b/src/application-services-impl/blob-storage/community.ts @@ -13,7 +13,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli public async communityPublicFilesList(communityId: string): Promise { let result: FileInfo[] = []; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.applicationServices.communityDataApi.getCommunityById(communityId); + let community = await this.context.applicationServices.communityDatastoreApi.getCommunityById(communityId); let communityDO = community as CommunityEntityReference; //new CommunityConverter().toDomain(community, { passport: passport }); if (!passport.forCommunity(communityDO).determineIf((permissions) => permissions.canManageSiteContent)) { return; @@ -57,7 +57,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli public async communityPublicFileRemove(communityId: string, fileName: string): Promise { const blobName = `public-files/${fileName}`; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.applicationServices.communityDataApi.getCommunityById(communityId); + let community = await this.context.applicationServices.communityDatastoreApi.getCommunityById(communityId); if (!community) { return; } @@ -88,7 +88,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli ) { let headerResult: CommunityBlobContentAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.applicationServices.communityDataApi.getCommunityById(communityId); + let community = await this.context.applicationServices.communityDatastoreApi.getCommunityById(communityId); if (!community) { headerResult = { status: { success: false, errorMessage: `Community not found: ${communityId}` } } as CommunityBlobContentAuthHeaderResult; return; diff --git a/src/application-services-impl/blob-storage/index.ts b/src/application-services-impl/blob-storage/index.ts index a15233e7..2f7ea8e5 100644 --- a/src/application-services-impl/blob-storage/index.ts +++ b/src/application-services-impl/blob-storage/index.ts @@ -1,6 +1,6 @@ -import { CommunityBlobStorageApplicationServiceImpl } from './community.application-service'; -import { MemberBlobStorageApplicationServiceImpl } from './member.application-service'; -import { PropertyBlobStorageApplicationServiceImpl } from './property.application-service'; +import { CommunityBlobStorageApplicationServiceImpl } from './community'; +import { MemberBlobStorageApplicationServiceImpl } from './member'; +import { PropertyBlobStorageApplicationServiceImpl } from './property'; export { CommunityBlobStorageApplicationServiceImpl as CommunityBlobApiImpl, diff --git a/src/application-services-impl/blob-storage/member.application-service.ts b/src/application-services-impl/blob-storage/member.ts similarity index 97% rename from src/application-services-impl/blob-storage/member.application-service.ts rename to src/application-services-impl/blob-storage/member.ts index 3d716359..3ad84224 100644 --- a/src/application-services-impl/blob-storage/member.application-service.ts +++ b/src/application-services-impl/blob-storage/member.ts @@ -9,7 +9,7 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat async memberProfileAvatarRemove(memberId: string): Promise { let mutationResult: MutationStatus; await this.withStorage(async (passport, blobStorage) => { - let member = await (await this.context.applicationServices.memberDataApi.getMemberByIdWithCommunity(memberId)); + let member = await (await this.context.applicationServices.memberDatastoreApi.getMemberByIdWithCommunity(memberId)); if (!member) { mutationResult = { success: false, errorMessage: `Member not found: ${memberId}` } as MutationStatus; } @@ -35,7 +35,7 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat let headerResult: MemberAvatarImageAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { - let member = await (await this.context.applicationServices.memberDataApi.getMemberByIdWithCommunity(memberId)); + let member = await (await this.context.applicationServices.memberDatastoreApi.getMemberByIdWithCommunity(memberId)); if (!member) { headerResult = { status: { success: false, errorMessage: `Member not found: ${memberId}` } } as MemberAvatarImageAuthHeaderResult; return; diff --git a/src/application-services-impl/blob-storage/property.application-service.ts b/src/application-services-impl/blob-storage/property.ts similarity index 97% rename from src/application-services-impl/blob-storage/property.application-service.ts rename to src/application-services-impl/blob-storage/property.ts index 63061e28..f3b7a232 100644 --- a/src/application-services-impl/blob-storage/property.application-service.ts +++ b/src/application-services-impl/blob-storage/property.ts @@ -18,7 +18,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic public async propertyPublicFileRemove(propertyId: string,memberId: string, fileName: string): Promise { const blobName = `public-files/${fileName}`; await this.withStorage(async (passport, blobStorage) => { - let property = await(await this.context.applicationServices.propertyDataApi.getPropertyByIdWithCommunityOwner(propertyId)); + let property = await(await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { return; } @@ -67,7 +67,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic public async propertyListingImageRemove(propertyId: string, memberId: string, blobName: string): Promise { let mutationResult: MutationStatus; await this.withStorage(async (passport, blobStorage) => { - let property = await (await this.context.applicationServices.propertyDataApi.getPropertyByIdWithCommunityOwner(propertyId)); + let property = await (await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { mutationResult = { success: false, errorMessage: `Property not found: ${propertyId}` } as MutationStatus; return; @@ -92,7 +92,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic let headerResult: PropertyBlobFileAuthHeaderResult; const { fileName, contentType, contentLength, maxSizeBytes } = fileInfo; await this.withStorage(async (passport, blobStorage) => { - let property = await (await this.context.applicationServices.propertyDataApi.getPropertyByIdWithCommunityOwner(propertyId)); + let property = await (await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { headerResult = { status: { success: false, errorMessage: `Property not found: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; return; diff --git a/src/application-services-impl/domain/community.ts b/src/application-services-impl/domain/community.ts index 709c5848..347e7835 100644 --- a/src/application-services-impl/domain/community.ts +++ b/src/application-services-impl/domain/community.ts @@ -21,7 +21,7 @@ export class CommunityDomainApplicationServiceImpl { @@ -38,7 +38,7 @@ export class MemberDomainApplicationServiceImpl { @@ -84,10 +84,10 @@ export class MemberDomainApplicationServiceImpl { let memberToReturn: Root; - let accountUser = await this.context.applicationServices.userDataApi.getUserById(input.account.user); + let accountUser = await this.context.applicationServices.userDatastoreApi.getUserById(input.account.user); let accountUserDo = accountUser as UserEntityReference; //new UserConverter().toDomain(mongoUser, { passport: ReadOnlyPassport.GetInstance() }); - let currentUser = await this.context.applicationServices.userDataApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); + let currentUser = await this.context.applicationServices.userDatastoreApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); let currentUserDo = currentUser as UserEntityReference; //new UserConverter().toDomain(currentMongoUser, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { diff --git a/src/application-services-impl/domain/property.ts b/src/application-services-impl/domain/property.ts index 5b0c64c3..6af71cee 100644 --- a/src/application-services-impl/domain/property.ts +++ b/src/application-services-impl/domain/property.ts @@ -25,7 +25,7 @@ export class PropertyDomainApplicationServiceImpl { @@ -38,7 +38,7 @@ export class PropertyDomainApplicationServiceImpl { let propertyToReturn: Root; - let member = await this.context.applicationServices.memberDataApi.getMemberById(input.owner?.id); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.owner?.id); let memberDo = member as MemberEntityReference; // new MemberConverter().toDomain(mongoMember, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { @@ -147,7 +147,7 @@ export class PropertyDomainApplicationServiceImpl { let propertyToReturn: Root; - let member = await this.context.applicationServices.memberDataApi.getMemberById(input.ownerId); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.ownerId); let memberDo = member as MemberEntityReference; // new MemberConverter().toDomain(mongoMember, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { let property = await repo.getById(input.id); diff --git a/src/application-services-impl/domain/role.ts b/src/application-services-impl/domain/role.ts index 2094ca09..74c58490 100644 --- a/src/application-services-impl/domain/role.ts +++ b/src/application-services-impl/domain/role.ts @@ -22,7 +22,7 @@ export class RoleDomainApplicationServiceImpl { @@ -88,7 +88,7 @@ export class RoleDomainApplicationServiceImpl { diff --git a/src/application-services-impl/domain/service-ticket.ts b/src/application-services-impl/domain/service-ticket.ts index 06a5e680..a11666b6 100644 --- a/src/application-services-impl/domain/service-ticket.ts +++ b/src/application-services-impl/domain/service-ticket.ts @@ -26,26 +26,26 @@ export class ServiceTicketDomainApplicationServiceImpl | undefined = undefined; if(input.serviceId) { - let service = await this.context.applicationServices.serviceDataApi.getServiceById(input.serviceId); + let service = await this.context.applicationServices.serviceDatastoreApi.getServiceById(input.serviceId); serviceDo = service as ServiceEntityReference; // new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); } @@ -71,14 +71,14 @@ export class ServiceTicketDomainApplicationServiceImpl | undefined = undefined; if(input.serviceId) { - let service = await this.context.applicationServices.serviceDataApi.getServiceById(input.serviceId); + let service = await this.context.applicationServices.serviceDatastoreApi.getServiceById(input.serviceId); serviceDo = service as ServiceEntityReference; // new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); } await this.withTransaction(async (repo) => { let serviceTicket = await repo.getById(input.serviceTicketId); if (serviceTicket.property.id !== input.propertyId) { - let property = await this.context.applicationServices.propertyDataApi.getPropertyById(input.propertyId); + let property = await this.context.applicationServices.propertyDatastoreApi.getPropertyById(input.propertyId); let propertyDo = property as PropertyEntityReference; //new PropertyConverter().toDomain(property, { passport: ReadOnlyPassport.GetInstance() }); serviceTicket.Property=(propertyDo); } @@ -110,7 +110,7 @@ export class ServiceTicketDomainApplicationServiceImpl | undefined = undefined; if (input.assignedToId) { - let member = await this.context.applicationServices.memberDataApi.getMemberById(input.assignedToId); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.assignedToId); memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); } await this.withTransaction(async (repo) => { @@ -122,8 +122,8 @@ export class ServiceTicketDomainApplicationServiceImpl { - let user = await this.context.applicationServices.userDataApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); - let member = await this.context.applicationServices.memberDataApi.getMemberByCommunityIdUserId(this.context.communityId, user.id); + let user = await this.context.applicationServices.userDatastoreApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberByCommunityIdUserId(this.context.communityId, user.id); let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); let serviceTicketToReturn: Root; await this.withTransaction(async (repo) => { @@ -135,8 +135,8 @@ export class ServiceTicketDomainApplicationServiceImpl { - let user = await this.context.applicationServices.userDataApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); - let member = await this.context.applicationServices.memberDataApi.getMemberByCommunityIdUserId(this.context.communityId, user.id); + let user = await this.context.applicationServices.userDatastoreApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberByCommunityIdUserId(this.context.communityId, user.id); let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); let serviceTicketToReturn: Root; await this.withTransaction(async (repo) => { diff --git a/src/application-services-impl/domain/service.ts b/src/application-services-impl/domain/service.ts index 42a54367..8d640d60 100644 --- a/src/application-services-impl/domain/service.ts +++ b/src/application-services-impl/domain/service.ts @@ -23,7 +23,7 @@ export class ServiceDomainApplicationServiceImpl { diff --git a/src/graphql/data-sources/cosmos-db/communities copy.ts b/src/graphql/data-sources/cosmos-db/communities copy.ts new file mode 100644 index 00000000..66ca5141 --- /dev/null +++ b/src/graphql/data-sources/cosmos-db/communities copy.ts @@ -0,0 +1,159 @@ +import { isValidObjectId, Types } from 'mongoose'; +import { Community, CommunityModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; +import { MemberModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; +import { UserModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/user'; +import { GraphqlContext } from '../../graphql-context'; +import { CosmosDataSource } from './cosmos-data-source'; + +export class Communities extends CosmosDataSource { + + async getCurrentCommunity(): Promise { + return this.findOneById(this.context.community); + } + async getCommunityById(id: string): Promise { + return this.findOneById(id); + } + async getCommunityByHandle(handle: string): Promise { + return this.findByFields({ handle: handle })?.[0]; + } + async getCommunityByDomain(domain: string): Promise { + return this.findByFields({ domain: domain })?.[0]; + } + async getCommunityByHeader(header: string): Promise { + console.log(`getCommunityByHeader`, header); + if (isValidObjectId(header)) { + console.log('valid header!objectId'); + return this.findOneById(header); + } + + return this.collection.find({ + $or: [{ handle: header }, { domain: header }, { whileLabelDomain: header }], + })?.[0]; + } + async userIsAdmin(communityId: string): Promise { + const externalId = this.context.verifiedUser.verifiedJWT.sub; + type MatchedDocsType = { + matchedDocs: number; + }; + const result = await MemberModel.aggregate( + [ + { + $match: { + community: new Types.ObjectId(communityId), + }, + }, + { + $project: { + _id: 0, + m: '$$ROOT', + }, + }, + { + $lookup: { + localField: 'm.role', + from: 'roles', + foreignField: '_id', + as: 'r', + }, + }, + { + $match: { + $or: [ + { + 'r.permissions.serviceTicketPermissions.canManageTickets': true, + }, + { + 'r.permissions.serviceTicketPermissions.canAssignTickets': true, + }, + { + 'r.permissions.serviceTicketPermissions.canWorkOnTickets': true, + }, + { + 'r.permissions.communityPermissions.canManageRolesAndPermissions': true, + }, + { + 'r.permissions.communityPermissions.canManageCommunitySettings': true, + }, + { + 'r.permissions.communityPermissions.canManageSiteContent': true, + }, + { + 'r.permissions.communityPermissions.canManageMembers': true, + }, + { + 'r.permissions.propertyPermissions.canManageProperties': true, + }, + ], + }, + }, + { + $lookup: { + localField: 'm.accounts.user', + from: 'users', + foreignField: '_id', + as: 'u', + }, + }, + { + $match: { + 'u.externalId': externalId, + }, + }, + { + $count: 'matchedDocs', + }, + ], + { + allowDiskUse: true, + } + ); + console.log(`communityId`, communityId); + console.log(`userIsAdmin`, result); + return result.reduce((acc, cur) => acc + cur.matchedDocs, 0) > 0; + } + + async getCommunitiesForCurrentUser(): Promise { + const externalId = this.context.verifiedUser.verifiedJWT.sub; + // starts from user (looking up by externalId), then find where they are a member, and then find the communities they are a member of + const result = await UserModel.aggregate([ + { + $match: { + externalId: externalId, + }, + }, + { + $lookup: { + from: 'members', + localField: '_id', + foreignField: 'accounts.user', + as: 'm', + }, + }, + { + $match: { + m: { + $ne: [], + }, + }, + }, + { + $lookup: { + from: 'communities', + localField: 'm.community', + foreignField: '_id', + as: 'c', + }, + }, + { + $unwind: { + path: '$c', + preserveNullAndEmptyArrays: true, + }, + }, + { + $replaceWith: '$c', + }, + ]).exec(); + return result.map((r) => CommunityModel.hydrate(r)); + } +} diff --git a/src/graphql/data-sources/cosmos-db/index.ts b/src/graphql/data-sources/cosmos-db/index.ts index 398009a5..a68f0f8d 100644 --- a/src/graphql/data-sources/cosmos-db/index.ts +++ b/src/graphql/data-sources/cosmos-db/index.ts @@ -15,9 +15,9 @@ import { Communities } from './communities'; import { Properties } from './properties'; export { - Users as UserCosmosdbAPI, + Users as UserDatastoreDatasource, UserModel, - Roles as RoleCosmosdbAPI, + Roles as RoleDatastoreDatasource, RoleModel, Services as ServiceCosmosdbAPI, ServiceModel, diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index ad837aa2..3496c8ed 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -1,7 +1,7 @@ import { GraphqlContext } from "../graphql-context"; import { CommunityBlobAPI, MemberBlobAPI, PropertyBlobAPI } from "./blob" import { PropertySearchAPI, ServiceTicketsSearchAPI } from "./cognitive-search"; -import { CommunityCosmosdbAPI, CommunityModel, MemberCosmosdbAPI, MemberModel, PropertyCosmosdbAPI, PropertyModel, RoleCosmosdbAPI, RoleModel, ServiceCosmosdbAPI, ServiceModel, ServiceTicketCosmosdbAPI, ServiceTicketModel, UserCosmosdbAPI, UserModel } from "./cosmos-db"; +import { CommunityCosmosdbAPI, CommunityModel, MemberCosmosdbAPI, MemberModel, PropertyCosmosdbAPI, PropertyModel, RoleDatastoreDatasource, RoleModel, ServiceCosmosdbAPI, ServiceModel, ServiceTicketCosmosdbAPI, ServiceTicketModel, UserDatastoreDatasource, UserModel } from "./cosmos-db"; import { CommunityDomainAPI, CommunityUnitOfWork, MemberDomainAPI, MemberUnitOfWork, PropertyDomainAPI, PropertyUnitOfWork, RoleDomainAPI, RoleUnitOfWork, ServiceDomainAPI, ServiceTicketDomainAPI, ServiceTicketUnitOfWork, ServiceUnitOfWork, UserDomainAPI, UserUnitOfWork } from "./domain"; import { PropertyMapAPI } from "./maps"; import { CommunityVercelAPI } from "./vercel"; @@ -12,8 +12,8 @@ export class DataSourceBuilder { propertyBlobAPI: PropertyBlobAPI; propertySearchApi: PropertySearchAPI; serviceTicketsSearchApi: ServiceTicketsSearchAPI; - userCosmosdbApi: UserCosmosdbAPI; - roleCosmosdbApi: RoleCosmosdbAPI; + userCosmosdbApi: UserDatastoreDatasource; + roleCosmosdbApi: RoleDatastoreDatasource; serviceCosmosdbApi: ServiceCosmosdbAPI; serviceTicketCosmosdbApi: ServiceTicketCosmosdbAPI; memberCosmosdbApi: MemberCosmosdbAPI; @@ -35,8 +35,8 @@ export class DataSourceBuilder { this.propertyBlobAPI = new PropertyBlobAPI({ context }); this.propertySearchApi = new PropertySearchAPI({ context }); this.serviceTicketsSearchApi = new ServiceTicketsSearchAPI({ context }); - this.userCosmosdbApi = new UserCosmosdbAPI({ modelOrCollection: UserModel, context }); - this.roleCosmosdbApi = new RoleCosmosdbAPI({ modelOrCollection: RoleModel, context }); + this.userCosmosdbApi = new UserDatastoreDatasource({ modelOrCollection: UserModel, context }); + this.roleCosmosdbApi = new RoleDatastoreDatasource({ modelOrCollection: RoleModel, context }); this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ modelOrCollection: ServiceModel, context }); this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ modelOrCollection: ServiceTicketModel, context }); this.memberCosmosdbApi = new MemberCosmosdbAPI({ modelOrCollection: MemberModel, context }); diff --git a/src/graphql/data-sources/data-source.ts b/src/graphql/data-sources/data-source.ts index 2ec4a90f..556fb87b 100644 --- a/src/graphql/data-sources/data-source.ts +++ b/src/graphql/data-sources/data-source.ts @@ -7,6 +7,10 @@ export interface DataSourceConfig { export abstract class DataSource { protected _context: TContext; + get context(): TContext { + return this._context; + } + constructor({ context, cache }: DataSourceConfig) { if (context) { this._context = context; diff --git a/src/graphql/graphql-context.ts b/src/graphql/graphql-context.ts index 950c70f5..16cb7a08 100644 --- a/src/graphql/graphql-context.ts +++ b/src/graphql/graphql-context.ts @@ -5,7 +5,6 @@ import { ApplicationServices } from '../app/application-services'; import { InfrastructureServices } from '../app/infrastructure-services'; import * as util from '../../seedwork/auth-seedwork-oidc/util'; import { AppContext, AppContextImpl } from '../app/app-context'; -import { ApplicationServicesBuilder } from '../startup/application-services-builder'; import { DataSourceBuilder } from './data-sources/data-source-builder'; export type VerifiedUser = { @@ -22,7 +21,6 @@ export interface GraphqlContext{ init( req: HttpRequest, portalTokenValidator: PortalTokenValidation, - // applicationServices: ApplicationServices, infrastructureServices: InfrastructureServices, ): Promise; dataSources: DataSourceBuilder; @@ -35,14 +33,12 @@ export class GraphqlContextImpl implements GraphqlContext{ private _portalTokenValidator: PortalTokenValidation; private _appContext: AppContext; private _verifiedUser: VerifiedUser; - private _applicationServices: ApplicationServices; private _infrastructureServices: InfrastructureServices; private _dataSources: DataSourceBuilder; public async init( req: HttpRequest, portalTokenValidator: PortalTokenValidation, - // applicationServices: ApplicationServices, infrastructureServices: InfrastructureServices, ) { // execute following in order @@ -51,7 +47,6 @@ export class GraphqlContextImpl implements GraphqlContext{ this._infrastructureServices = infrastructureServices; await this.setVerifiedUser(); await this.setAppContext(); - // this._applicationServices = new ApplicationServicesBuilder(this._appContext); await this.setReqHeaders(); this._dataSources = new DataSourceBuilder(this); } @@ -60,7 +55,6 @@ export class GraphqlContextImpl implements GraphqlContext{ this._appContext = new AppContextImpl( this._verifiedUser, this._req.headers.get('community'), - // this._applicationServices, this._infrastructureServices ); await this._appContext.init(); diff --git a/src/startup/application-services-builder.ts b/src/startup/application-services-builder.ts index 0cfcd863..6d617a4e 100644 --- a/src/startup/application-services-builder.ts +++ b/src/startup/application-services-builder.ts @@ -1,18 +1,18 @@ import { ApplicationServices } from "../app/application-services"; import { AppContext } from "../app/app-context"; import { - CommunityBlobAPI, - MemberBlobAPI, - PropertyBlobAPI, - PropertySearchAPI, - ServiceTicketSearchAPI, - UserDataAPI, - RoleDataAPI, - ServiceDataAPI, - ServiceTicketDataAPI, - MemberDataAPI, - CommunityDataAPI, - PropertyDataAPI, + CommunityBlobStorageAPI, + MemberBlobStorageAPI, + PropertyBlobStorageAPI, + PropertyCognitiveSearchAPI, + ServiceTicketCognitiveSearchAPI, + UserDatastoreAPI, + RoleDatastoreAPI, + ServiceDatastoreAPI, + ServiceTicketDatastoreAPI, + MemberDatastoreAPI, + CommunityDatastoreAPI, + PropertyDatastoreAPI, UserDomainAPI, CommunityDomainAPI, MemberDomainAPI, @@ -56,18 +56,18 @@ import { MongoServiceUnitOfWork } from "../infrastructure-services-impl/datastor import { MongoServiceTicketUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.uow"; export class ApplicationServicesBuilder implements ApplicationServices{ - communityBlobApi: CommunityBlobAPI; - memberBlobApi: MemberBlobAPI; - propertyBlobApi: PropertyBlobAPI; - propertySearchApi: PropertySearchAPI; - serviceTicketSearchApi: ServiceTicketSearchAPI; - userDataApi: UserDataAPI; - roleDataApi: RoleDataAPI; - serviceDataApi: ServiceDataAPI; - serviceTicketDataApi: ServiceTicketDataAPI; - memberDataApi: MemberDataAPI; - communityDataApi: CommunityDataAPI; - propertyDataApi: PropertyDataAPI; + communityBlobStorageApi: CommunityBlobStorageAPI; + memberBlobStorageApi: MemberBlobStorageAPI; + propertyBlobStorageApi: PropertyBlobStorageAPI; + propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; + serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; + userDatastoreApi: UserDatastoreAPI; + roleDatastoreApi: RoleDatastoreAPI; + serviceDatastoreApi: ServiceDatastoreAPI; + serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; + memberDatastoreApi: MemberDatastoreAPI; + communityDatastoreApi: CommunityDatastoreAPI; + propertyDatastoreApi: PropertyDatastoreAPI; userDomainApi: UserDomainAPI; communityDomainApi: CommunityDomainAPI; memberDomainApi: MemberDomainAPI; @@ -79,18 +79,18 @@ export class ApplicationServicesBuilder implements ApplicationServices{ communityVercelApi: CommunityVercelAPI; constructor(context: AppContext) { - this.communityBlobApi = new CommunityBlobApiImpl({ context }); - this.memberBlobApi = new MemberBlobApiImpl({ context }); - this.propertyBlobApi = new PropertyBlobApiImpl({ context }); - this.propertySearchApi = new PropertySearchApiImpl({ context }); - this.serviceTicketSearchApi = new ServiceTicketSearchApiImpl({ context }); - this.userDataApi = new UserDataApiImpl({ context }); - this.roleDataApi = new RoleDataApiImpl({ context }); - this.serviceDataApi = new ServiceDataApiImpl({ context }); - this.serviceTicketDataApi = new ServiceTicketDataApiImpl({ context }); - this.memberDataApi = new MemberDataApiImpl({ context }); - this.communityDataApi = new CommunityDataApiImpl({ context }); - this.propertyDataApi = new PropertyDataApiImpl({ context }); + this.communityBlobStorageApi = new CommunityBlobApiImpl({ context }); + this.memberBlobStorageApi = new MemberBlobApiImpl({ context }); + this.propertyBlobStorageApi = new PropertyBlobApiImpl({ context }); + this.propertyCognitiveSearchApi = new PropertySearchApiImpl({ context }); + this.serviceTicketCognitiveSearchApi = new ServiceTicketSearchApiImpl({ context }); + this.userDatastoreApi = new UserDataApiImpl({ context }); + this.roleDatastoreApi = new RoleDataApiImpl({ context }); + this.serviceDatastoreApi = new ServiceDataApiImpl({ context }); + this.serviceTicketDatastoreApi = new ServiceTicketDataApiImpl({ context }); + this.memberDatastoreApi = new MemberDataApiImpl({ context }); + this.communityDatastoreApi = new CommunityDataApiImpl({ context }); + this.propertyDatastoreApi = new PropertyDataApiImpl({ context }); this.userDomainApi = new UserDomainApiImpl({unitOfWork: MongoUserUnitOfWork, context }); this.communityDomainApi = new CommunityDomainApiImpl({ unitOfWork: MongoCommunityUnitOfWork, context }); this.memberDomainApi = new MemberDomainApiImpl({ unitOfWork: MongoMemberUnitOfWork,context }); From bdb79505bae3bdee7308660d93a2425f9e8bd102 Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 12:30:30 -0400 Subject: [PATCH 03/11] community and member data sources done --- src/graphql/data-sources/blob/communities.ts | 13 +- src/graphql/data-sources/blob/members.ts | 12 +- .../cosmos-db/communities copy.ts | 159 ----------------- .../data-sources/cosmos-db/communities.ts | 163 ++---------------- src/graphql/data-sources/cosmos-db/members.ts | 58 ++----- .../data-sources/data-source-builder.ts | 4 +- src/graphql/data-sources/domain/members.ts | 3 +- src/graphql/data-sources/domain/properties.ts | 12 +- src/graphql/data-sources/domain/roles.ts | 3 +- .../data-sources/domain/service-tickets.ts | 22 +-- src/graphql/data-sources/domain/services.ts | 3 +- .../schema/types/community.resolvers.ts | 3 +- src/graphql/schema/types/member.resolvers.ts | 4 +- .../schema/types/property.resolvers.ts | 4 +- src/graphql/schema/types/role.resolvers.ts | 2 +- .../schema/types/service-ticket.resolvers.ts | 8 +- src/graphql/schema/types/service.resolvers.ts | 2 +- .../community.mongo-datastore.ts | 3 +- 18 files changed, 84 insertions(+), 394 deletions(-) delete mode 100644 src/graphql/data-sources/cosmos-db/communities copy.ts diff --git a/src/graphql/data-sources/blob/communities.ts b/src/graphql/data-sources/blob/communities.ts index 89dcb6e5..fe46ca5a 100644 --- a/src/graphql/data-sources/blob/communities.ts +++ b/src/graphql/data-sources/blob/communities.ts @@ -3,13 +3,14 @@ import { GraphqlContext } from '../../graphql-context'; import { CommunityConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/community.domain-adapter'; import { CommunityBlobContentAuthHeaderResult, FileInfo } from '../../schema/builder/generated'; import { BlobRequestSettings } from '../../../../seedwork/services-seedwork-blob-storage-az'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; export class Communities extends BlobDataSource { public async communityPublicFilesList(communityId: string): Promise { let result: FileInfo[] = []; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.dataSources.communityCosmosdbApi.findOneById(communityId); - let communityDO = new CommunityConverter().toDomain(community, { passport: passport }); + let community = await this.context.dataSources.communityCosmosdbApi.getCommunityById(communityId); + let communityDO = community as CommunityEntityReference; // new CommunityConverter().toDomain(community, { passport: passport }); if (!passport.forCommunity(communityDO).determineIf((permissions) => permissions.canManageSiteContent)) { return; } @@ -52,11 +53,11 @@ export class Communities extends BlobDataSource { public async communityPublicFileRemove(communityId: string, fileName: string): Promise { const blobName = `public-files/${fileName}`; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.dataSources.communityCosmosdbApi.findOneById(communityId); + let community = await this.context.dataSources.communityCosmosdbApi.getCommunityById(communityId); if (!community) { return; } - let communityDO = new CommunityConverter().toDomain(community, { passport: passport }); + let communityDO = community as CommunityEntityReference; //new CommunityConverter().toDomain(community, { passport: passport }); if (!passport.forCommunity(communityDO).determineIf((permissions) => permissions.canManageSiteContent)) { return; } @@ -83,12 +84,12 @@ export class Communities extends BlobDataSource { ) { let headerResult: CommunityBlobContentAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { - let community = await this.context.dataSources.communityCosmosdbApi.findOneById(communityId); + let community = await this.context.dataSources.communityCosmosdbApi.getCommunityById(communityId); if (!community) { headerResult = { status: { success: false, errorMessage: `Community not found: ${communityId}` } } as CommunityBlobContentAuthHeaderResult; return; } - let communityDO = new CommunityConverter().toDomain(community, { passport: passport }); + let communityDO = community as CommunityEntityReference; //new CommunityConverter().toDomain(community, { passport: passport }); if (!passport.forCommunity(communityDO).determineIf((permissions) => permissions.canManageSiteContent)) { headerResult = { status: { success: false, errorMessage: `User does not have permission to create content for community: ${communityId}` }, diff --git a/src/graphql/data-sources/blob/members.ts b/src/graphql/data-sources/blob/members.ts index 6bd7ad16..0cce4557 100644 --- a/src/graphql/data-sources/blob/members.ts +++ b/src/graphql/data-sources/blob/members.ts @@ -3,16 +3,17 @@ import { GraphqlContext } from '../../graphql-context'; import { MemberAvatarImageAuthHeaderResult, MutationStatus, BlobAuthHeader } from '../../schema/builder/generated'; import { MemberConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter'; import { BlobRequestSettings } from '../../../../seedwork/services-seedwork-blob-storage-interfaces'; +import { MemberEntityReference } from '../../../app/domain/contexts/community/member'; export class Members extends BlobDataSource { async memberProfileAvatarRemove(memberId: string): Promise { let mutationResult: MutationStatus; await this.withStorage(async (passport, blobStorage) => { - let member = await (await this.context.dataSources.memberCosmosdbApi.findOneById(memberId)).populate('community'); + let member = await (await this.context.applicationServices.memberDatastoreApi.getMemberByIdWithCommunity(memberId)); if (!member) { mutationResult = { success: false, errorMessage: `Member not found: ${memberId}` } as MutationStatus; } - let memberDo = new MemberConverter().toDomain(member, { passport: passport }); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: passport }); if ( !passport .forMember(memberDo) @@ -21,7 +22,8 @@ export class Members extends BlobDataSource { mutationResult = { success: false, errorMessage: `User does not have permission to remove avatar for member: ${memberId}` } as MutationStatus; return; } - await blobStorage.deleteBlob(member.profile.avatarDocumentId, member.community.id); + const communityId = typeof member.community === 'string' ? member.community : member.community.id; + await blobStorage.deleteBlob(member.profile.avatarDocumentId, communityId); mutationResult = { success: true } as MutationStatus; }); return mutationResult; @@ -33,12 +35,12 @@ export class Members extends BlobDataSource { let headerResult: MemberAvatarImageAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { - let member = await (await this.context.dataSources.memberCosmosdbApi.findOneById(memberId)).populate('community'); + let member = await (await this.context.applicationServices.memberDatastoreApi.getMemberByIdWithCommunity(memberId)); if (!member) { headerResult = { status: { success: false, errorMessage: `Member not found: ${memberId}` } } as MemberAvatarImageAuthHeaderResult; return; } - let memberDo = new MemberConverter().toDomain(member, { passport: passport }); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: passport }); if ( !passport .forMember(memberDo) diff --git a/src/graphql/data-sources/cosmos-db/communities copy.ts b/src/graphql/data-sources/cosmos-db/communities copy.ts deleted file mode 100644 index 66ca5141..00000000 --- a/src/graphql/data-sources/cosmos-db/communities copy.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { isValidObjectId, Types } from 'mongoose'; -import { Community, CommunityModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; -import { MemberModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; -import { UserModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/user'; -import { GraphqlContext } from '../../graphql-context'; -import { CosmosDataSource } from './cosmos-data-source'; - -export class Communities extends CosmosDataSource { - - async getCurrentCommunity(): Promise { - return this.findOneById(this.context.community); - } - async getCommunityById(id: string): Promise { - return this.findOneById(id); - } - async getCommunityByHandle(handle: string): Promise { - return this.findByFields({ handle: handle })?.[0]; - } - async getCommunityByDomain(domain: string): Promise { - return this.findByFields({ domain: domain })?.[0]; - } - async getCommunityByHeader(header: string): Promise { - console.log(`getCommunityByHeader`, header); - if (isValidObjectId(header)) { - console.log('valid header!objectId'); - return this.findOneById(header); - } - - return this.collection.find({ - $or: [{ handle: header }, { domain: header }, { whileLabelDomain: header }], - })?.[0]; - } - async userIsAdmin(communityId: string): Promise { - const externalId = this.context.verifiedUser.verifiedJWT.sub; - type MatchedDocsType = { - matchedDocs: number; - }; - const result = await MemberModel.aggregate( - [ - { - $match: { - community: new Types.ObjectId(communityId), - }, - }, - { - $project: { - _id: 0, - m: '$$ROOT', - }, - }, - { - $lookup: { - localField: 'm.role', - from: 'roles', - foreignField: '_id', - as: 'r', - }, - }, - { - $match: { - $or: [ - { - 'r.permissions.serviceTicketPermissions.canManageTickets': true, - }, - { - 'r.permissions.serviceTicketPermissions.canAssignTickets': true, - }, - { - 'r.permissions.serviceTicketPermissions.canWorkOnTickets': true, - }, - { - 'r.permissions.communityPermissions.canManageRolesAndPermissions': true, - }, - { - 'r.permissions.communityPermissions.canManageCommunitySettings': true, - }, - { - 'r.permissions.communityPermissions.canManageSiteContent': true, - }, - { - 'r.permissions.communityPermissions.canManageMembers': true, - }, - { - 'r.permissions.propertyPermissions.canManageProperties': true, - }, - ], - }, - }, - { - $lookup: { - localField: 'm.accounts.user', - from: 'users', - foreignField: '_id', - as: 'u', - }, - }, - { - $match: { - 'u.externalId': externalId, - }, - }, - { - $count: 'matchedDocs', - }, - ], - { - allowDiskUse: true, - } - ); - console.log(`communityId`, communityId); - console.log(`userIsAdmin`, result); - return result.reduce((acc, cur) => acc + cur.matchedDocs, 0) > 0; - } - - async getCommunitiesForCurrentUser(): Promise { - const externalId = this.context.verifiedUser.verifiedJWT.sub; - // starts from user (looking up by externalId), then find where they are a member, and then find the communities they are a member of - const result = await UserModel.aggregate([ - { - $match: { - externalId: externalId, - }, - }, - { - $lookup: { - from: 'members', - localField: '_id', - foreignField: 'accounts.user', - as: 'm', - }, - }, - { - $match: { - m: { - $ne: [], - }, - }, - }, - { - $lookup: { - from: 'communities', - localField: 'm.community', - foreignField: '_id', - as: 'c', - }, - }, - { - $unwind: { - path: '$c', - preserveNullAndEmptyArrays: true, - }, - }, - { - $replaceWith: '$c', - }, - ]).exec(); - return result.map((r) => CommunityModel.hydrate(r)); - } -} diff --git a/src/graphql/data-sources/cosmos-db/communities.ts b/src/graphql/data-sources/cosmos-db/communities.ts index 66ca5141..aa6225d5 100644 --- a/src/graphql/data-sources/cosmos-db/communities.ts +++ b/src/graphql/data-sources/cosmos-db/communities.ts @@ -1,159 +1,28 @@ -import { isValidObjectId, Types } from 'mongoose'; -import { Community, CommunityModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; -import { MemberModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; -import { UserModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/user'; import { GraphqlContext } from '../../graphql-context'; -import { CosmosDataSource } from './cosmos-data-source'; +import { CommunityDataStructure } from '../../../app/application-services/datastore'; +import { DataSource } from '../data-source'; -export class Communities extends CosmosDataSource { +export class Communities extends DataSource { - async getCurrentCommunity(): Promise { - return this.findOneById(this.context.community); + async getCurrentCommunity(): Promise { + return this.context.applicationServices.communityDatastoreApi.getCurrentCommunity(); } - async getCommunityById(id: string): Promise { - return this.findOneById(id); + async getCommunityById(id: string): Promise { + return this.context.applicationServices.communityDatastoreApi.getCommunityById(id); } - async getCommunityByHandle(handle: string): Promise { - return this.findByFields({ handle: handle })?.[0]; + async getCommunityByHandle(handle: string): Promise { + return this.context.applicationServices.communityDatastoreApi.getCommunityByHandle(handle); } - async getCommunityByDomain(domain: string): Promise { - return this.findByFields({ domain: domain })?.[0]; + async getCommunityByDomain(domain: string): Promise { + return this.context.applicationServices.communityDatastoreApi.getCommunityByDomain(domain); } - async getCommunityByHeader(header: string): Promise { - console.log(`getCommunityByHeader`, header); - if (isValidObjectId(header)) { - console.log('valid header!objectId'); - return this.findOneById(header); - } - - return this.collection.find({ - $or: [{ handle: header }, { domain: header }, { whileLabelDomain: header }], - })?.[0]; + async getCommunityByHeader(header: string): Promise { + return this.context.applicationServices.communityDatastoreApi.getCommunityByHeader(header); } async userIsAdmin(communityId: string): Promise { - const externalId = this.context.verifiedUser.verifiedJWT.sub; - type MatchedDocsType = { - matchedDocs: number; - }; - const result = await MemberModel.aggregate( - [ - { - $match: { - community: new Types.ObjectId(communityId), - }, - }, - { - $project: { - _id: 0, - m: '$$ROOT', - }, - }, - { - $lookup: { - localField: 'm.role', - from: 'roles', - foreignField: '_id', - as: 'r', - }, - }, - { - $match: { - $or: [ - { - 'r.permissions.serviceTicketPermissions.canManageTickets': true, - }, - { - 'r.permissions.serviceTicketPermissions.canAssignTickets': true, - }, - { - 'r.permissions.serviceTicketPermissions.canWorkOnTickets': true, - }, - { - 'r.permissions.communityPermissions.canManageRolesAndPermissions': true, - }, - { - 'r.permissions.communityPermissions.canManageCommunitySettings': true, - }, - { - 'r.permissions.communityPermissions.canManageSiteContent': true, - }, - { - 'r.permissions.communityPermissions.canManageMembers': true, - }, - { - 'r.permissions.propertyPermissions.canManageProperties': true, - }, - ], - }, - }, - { - $lookup: { - localField: 'm.accounts.user', - from: 'users', - foreignField: '_id', - as: 'u', - }, - }, - { - $match: { - 'u.externalId': externalId, - }, - }, - { - $count: 'matchedDocs', - }, - ], - { - allowDiskUse: true, - } - ); - console.log(`communityId`, communityId); - console.log(`userIsAdmin`, result); - return result.reduce((acc, cur) => acc + cur.matchedDocs, 0) > 0; + return this.context.applicationServices.communityDatastoreApi.userIsAdmin(communityId); } - - async getCommunitiesForCurrentUser(): Promise { - const externalId = this.context.verifiedUser.verifiedJWT.sub; - // starts from user (looking up by externalId), then find where they are a member, and then find the communities they are a member of - const result = await UserModel.aggregate([ - { - $match: { - externalId: externalId, - }, - }, - { - $lookup: { - from: 'members', - localField: '_id', - foreignField: 'accounts.user', - as: 'm', - }, - }, - { - $match: { - m: { - $ne: [], - }, - }, - }, - { - $lookup: { - from: 'communities', - localField: 'm.community', - foreignField: '_id', - as: 'c', - }, - }, - { - $unwind: { - path: '$c', - preserveNullAndEmptyArrays: true, - }, - }, - { - $replaceWith: '$c', - }, - ]).exec(); - return result.map((r) => CommunityModel.hydrate(r)); + async getCommunitiesForCurrentUser(): Promise { + return this.context.applicationServices.communityDatastoreApi.getCommunitiesForCurrentUser(); } } diff --git a/src/graphql/data-sources/cosmos-db/members.ts b/src/graphql/data-sources/cosmos-db/members.ts index d7e4dcc9..1afbd8d4 100644 --- a/src/graphql/data-sources/cosmos-db/members.ts +++ b/src/graphql/data-sources/cosmos-db/members.ts @@ -1,51 +1,21 @@ -import { Member, MemberModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; -import { RoleModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/role'; import { GraphqlContext } from '../../graphql-context'; -import { Types } from 'mongoose'; -import { CosmosDataSource } from './cosmos-data-source'; +import { MemberDataStructure } from '../../../app/application-services/datastore'; +import { DataSource } from '../data-source'; -export class Members extends CosmosDataSource { - async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { - return ( - await this.findByFields({ - community: communityId, - 'accounts.user': userId, - }) - )?.[0]; +export class Members extends DataSource { + async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { + return this.context.applicationServices.memberDatastoreApi.getMemberByCommunityIdUserId(communityId, userId); } - async getMembers(): Promise { - return this.findByFields({ community: this.context.community }); + async getMembers(): Promise { + return this.context.applicationServices.memberDatastoreApi.getMembers(); } - async getMembersByCommunityId(communityId: string): Promise { - return this.findByFields({ community: communityId }); + async getMembersByCommunityId(communityId: string): Promise { + return this.context.applicationServices.memberDatastoreApi.getMembersByCommunityId(communityId); } - async getMembersAssignableToTickets(): Promise { - const communityId = this.context.community; - const result = await RoleModel.aggregate([ - { - $match: { - community: new Types.ObjectId(communityId), - 'permissions.serviceTicketPermissions.canWorkOnTickets': true, - }, - }, - { - $lookup: { - from: 'members', - localField: '_id', - foreignField: 'role', - as: 'm', - }, - }, - { - $unwind: { - path: '$m', - }, - }, - { - $replaceWith: '$m', - }, - ]).exec(); - console.log(`getMembersAssignableToTickets`, result); - return result.map((r) => MemberModel.hydrate(r)); + async getMembersAssignableToTickets(): Promise { + return this.context.applicationServices.memberDatastoreApi.getMembersAssignableToTickets(); + } + async getMemberById(memberId: string): Promise { + return this.context.applicationServices.memberDatastoreApi.getMemberById(memberId); } } diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index 3496c8ed..133fc12c 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -39,8 +39,8 @@ export class DataSourceBuilder { this.roleCosmosdbApi = new RoleDatastoreDatasource({ modelOrCollection: RoleModel, context }); this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ modelOrCollection: ServiceModel, context }); this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ modelOrCollection: ServiceTicketModel, context }); - this.memberCosmosdbApi = new MemberCosmosdbAPI({ modelOrCollection: MemberModel, context }); - this.communityCosmosdbApi = new CommunityCosmosdbAPI({ modelOrCollection: CommunityModel, context }); + this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, + this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ modelOrCollection: PropertyModel, context }); this.userDomainAPI = new UserDomainAPI({ unitOfWork: UserUnitOfWork, context }); this.communityDomainAPI = new CommunityDomainAPI({ unitOfWork: CommunityUnitOfWork, context }); diff --git a/src/graphql/data-sources/domain/members.ts b/src/graphql/data-sources/domain/members.ts index 1459b4ca..c9cdf6c8 100644 --- a/src/graphql/data-sources/domain/members.ts +++ b/src/graphql/data-sources/domain/members.ts @@ -11,6 +11,7 @@ import { RoleConverter } from '../../../infrastructure-services-impl/datastore/m import { UserConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/user.domain-adapter'; import { Interests } from '../../../app/domain/contexts/community/profile.value-objects'; import { CustomViewColumnsToDisplay, CustomViewFilters } from '../../../app/domain/contexts/community/custom-view.value-objects'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; type PropType = MemberDomainAdapter; type DomainType = MemberDO; @@ -25,7 +26,7 @@ export class Members extends DomainDataSource { let newMember = await repo.getNewInstance(input.memberName, communityDo); diff --git a/src/graphql/data-sources/domain/properties.ts b/src/graphql/data-sources/domain/properties.ts index 482aafac..2e7a7af3 100644 --- a/src/graphql/data-sources/domain/properties.ts +++ b/src/graphql/data-sources/domain/properties.ts @@ -10,6 +10,8 @@ import { ReadOnlyPassport } from '../../../app/domain/contexts/iam/passport'; import { MemberConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter'; import { Amenities, Images } from '../../../app/domain/contexts/property/listing-detail.value-objects'; import { BedDescriptions } from '../../../app/domain/contexts/property/bedroom-detail.value-objects'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; +import { MemberEntityReference } from '../../../app/domain/contexts/community/member'; type PropType = PropertyDomainAdapter; type DomainType = PropertyDO; @@ -24,7 +26,7 @@ export class Properties extends DomainDataSource { let newProperty = await repo.getNewInstance(input.propertyName, communityDo); @@ -36,8 +38,8 @@ export class Properties extends DomainDataSource { let propertyToReturn: Property; - let mongoMember = await this.context.dataSources.memberCosmosdbApi.findOneById(input.owner?.id); - let memberDo = new MemberConverter().toDomain(mongoMember, { passport: ReadOnlyPassport.GetInstance() }); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.owner?.id); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { let property = await repo.getById(input.id); @@ -145,8 +147,8 @@ export class Properties extends DomainDataSource { let propertyToReturn: Property; - let mongoMember = await this.context.dataSources.memberCosmosdbApi.findOneById(input.ownerId); - let memberDo = new MemberConverter().toDomain(mongoMember, { passport: ReadOnlyPassport.GetInstance() }); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.ownerId); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { let property = await repo.getById(input.id); property.Owner=(memberDo); diff --git a/src/graphql/data-sources/domain/roles.ts b/src/graphql/data-sources/domain/roles.ts index a57d9b6a..5e907e92 100644 --- a/src/graphql/data-sources/domain/roles.ts +++ b/src/graphql/data-sources/domain/roles.ts @@ -7,6 +7,7 @@ import { DomainDataSource } from './domain-data-source'; import { Role } from '../../../infrastructure-services-impl/datastore/mongodb/models/role'; import { CommunityConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/community.domain-adapter'; import { ReadOnlyPassport } from '../../../app/domain/contexts/iam/passport'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; type PropType = RoleDomainAdapter; type DomainType = RoleDO; @@ -22,7 +23,7 @@ export class Roles extends DomainDataSource { let roleDo = await repo.getNewInstance( diff --git a/src/graphql/data-sources/domain/service-tickets.ts b/src/graphql/data-sources/domain/service-tickets.ts index 7b8a15b9..8a8a5ba0 100644 --- a/src/graphql/data-sources/domain/service-tickets.ts +++ b/src/graphql/data-sources/domain/service-tickets.ts @@ -1,6 +1,6 @@ import { ServiceTicket as ServiceTicketDO } from '../../../app/domain/contexts/service-ticket/service-ticket'; import { Service as ServiceDO } from '../../../app/domain/contexts/service-ticket/service'; -import { Member as MemberDO } from '../../../app/domain/contexts/community/member'; +import { Member as MemberDO, MemberEntityReference } from '../../../app/domain/contexts/community/member'; import { ServiceTicketConverter, ServiceTicketDomainAdapter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter'; import { MongoServiceTicketRepository } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.mongo-repository'; import { GraphqlContext } from '../../graphql-context'; @@ -13,6 +13,8 @@ import { ReadOnlyPassport } from '../../../app/domain/contexts/iam/passport'; import { MemberConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter'; import { ServiceConverter, ServiceDomainAdapter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service.domain-adapter'; import { PropertyConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; +import { MemberDataStructure } from '../../../app/application-services/datastore'; type PropType = ServiceTicketDomainAdapter; type DomainType = ServiceTicketDO; @@ -27,21 +29,21 @@ export class ServiceTickets extends DomainDataSource | undefined = undefined; if(input.serviceId) { @@ -108,10 +110,10 @@ export class ServiceTickets extends DomainDataSource { let serviceTicketToReturn: ServiceTicket; - let memberDo: MemberDO | undefined = undefined; + let memberDo: MemberEntityReference; //MemberDO | undefined = undefined; if (input.assignedToId) { - let member = await this.context.dataSources.memberCosmosdbApi.findOneById(input.assignedToId); - memberDo = new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); + let member = await this.context.applicationServices.memberDatastoreApi.getMemberById(input.assignedToId); + memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); } await this.withTransaction(async (repo) => { let serviceTicket = await repo.getById(input.serviceTicketId); @@ -124,7 +126,7 @@ export class ServiceTickets extends DomainDataSource { let user = await this.context.dataSources.userCosmosdbApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); let member = await this.context.dataSources.memberCosmosdbApi.getMemberByCommunityIdUserId(this.context.community, user.id); - let memberDo = new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); let serviceTicketToReturn: ServiceTicket; await this.withTransaction(async (repo) => { let serviceTicket = await repo.getById(input.serviceTicketId); @@ -137,7 +139,7 @@ export class ServiceTickets extends DomainDataSource { let user = await this.context.dataSources.userCosmosdbApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); let member = await this.context.dataSources.memberCosmosdbApi.getMemberByCommunityIdUserId(this.context.community, user.id); - let memberDo = new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); + let memberDo = member as MemberEntityReference; //new MemberConverter().toDomain(member, { passport: ReadOnlyPassport.GetInstance() }); let serviceTicketToReturn: ServiceTicket; await this.withTransaction(async (repo) => { let serviceTicket = await repo.getById(input.serviceTicketId); diff --git a/src/graphql/data-sources/domain/services.ts b/src/graphql/data-sources/domain/services.ts index 7b3fd430..092157e3 100644 --- a/src/graphql/data-sources/domain/services.ts +++ b/src/graphql/data-sources/domain/services.ts @@ -7,6 +7,7 @@ import { DomainDataSource } from './domain-data-source'; import { Service } from '../../../infrastructure-services-impl/datastore/mongodb/models/service'; import { CommunityConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/community.domain-adapter'; import { ReadOnlyPassport } from '../../../app/domain/contexts/iam/passport'; +import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; type PropType = ServiceDomainAdapter; type DomainType = ServiceDO; @@ -22,7 +23,7 @@ export class Services extends DomainDataSource { let newService = await repo.getNewInstance( diff --git a/src/graphql/schema/types/community.resolvers.ts b/src/graphql/schema/types/community.resolvers.ts index a2044354..08d778c3 100644 --- a/src/graphql/schema/types/community.resolvers.ts +++ b/src/graphql/schema/types/community.resolvers.ts @@ -1,7 +1,8 @@ import { Resolvers, Community, CommunityMutationResult, Role } from '../builder/generated'; import { Community as CommunityDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; +import { CommunityDataStructure } from '../../../app/application-services/datastore'; -const CommunityMutationResolver = async (getCommunity: Promise): Promise => { +const CommunityMutationResolver = async (getCommunity: Promise): Promise => { try { return { status: { success: true }, diff --git a/src/graphql/schema/types/member.resolvers.ts b/src/graphql/schema/types/member.resolvers.ts index 37662cd9..bc17e316 100644 --- a/src/graphql/schema/types/member.resolvers.ts +++ b/src/graphql/schema/types/member.resolvers.ts @@ -20,7 +20,7 @@ const member: Resolvers = { Member: { community: async (parent, _args, context) => { if (parent.community && isValidObjectId(parent.community.toString())) { - return (await context.dataSources.communityCosmosdbApi.findOneById(parent.community.toString())) as Community; + return (await context.dataSources.communityCosmosdbApi.getCommunityById(parent.community.toString())) as Community; } return parent.community; }, @@ -48,7 +48,7 @@ const member: Resolvers = { Query: { member: async (_parent, {id}, context) => { if (id && isValidObjectId(id)) { - return (await context.dataSources.memberCosmosdbApi.findOneById(id)) as Member; + return (await context.dataSources.memberCosmosdbApi.getMemberById(id)) as Member; } return null; }, diff --git a/src/graphql/schema/types/property.resolvers.ts b/src/graphql/schema/types/property.resolvers.ts index 7e5223fc..6a2b2596 100644 --- a/src/graphql/schema/types/property.resolvers.ts +++ b/src/graphql/schema/types/property.resolvers.ts @@ -28,13 +28,13 @@ const property: Resolvers = { }, community: async (parent, _args, {dataSources}, _info) => { if (parent.community && isValidObjectId(parent.community.toString())) { - return (await dataSources.communityCosmosdbApi.findOneById(parent.community.toString())) as Community; + return (await dataSources.communityCosmosdbApi.getCommunityById(parent.community.toString())) as Community; } return parent.community; }, owner: async (parent, _args, {dataSources}, _info) => { if (parent.owner && isValidObjectId(parent.owner.toString())) { - return (await dataSources.memberCosmosdbApi.findOneById(parent.owner.toString())) as Member; + return (await dataSources.memberCosmosdbApi.getMemberById(parent.owner.toString())) as Member; } return parent.owner; }, diff --git a/src/graphql/schema/types/role.resolvers.ts b/src/graphql/schema/types/role.resolvers.ts index 6e7794e7..6b320ff2 100644 --- a/src/graphql/schema/types/role.resolvers.ts +++ b/src/graphql/schema/types/role.resolvers.ts @@ -21,7 +21,7 @@ const role: Resolvers = { Role: { community: async (parent, _args, context, _info) => { if (parent.community && isValidObjectId(parent.community.toString())) { - return (await context.dataSources.communityCosmosdbApi.findOneById(parent.community.toString())) as Community; + return (await context.dataSources.communityCosmosdbApi.getCommunityById(parent.community.toString())) as Community; } return parent.community; }, diff --git a/src/graphql/schema/types/service-ticket.resolvers.ts b/src/graphql/schema/types/service-ticket.resolvers.ts index aaee2238..8efa7402 100644 --- a/src/graphql/schema/types/service-ticket.resolvers.ts +++ b/src/graphql/schema/types/service-ticket.resolvers.ts @@ -22,7 +22,7 @@ const serviceTicket: Resolvers = { ServiceTicket: { community: async (parent, args, context, info) => { if (parent.community && isValidObjectId(parent.community.toString())) { - return (await context.dataSources.communityCosmosdbApi.findOneById(parent.community.toString())) as Community; + return (await context.dataSources.communityCosmosdbApi.getCommunityById(parent.community.toString())) as Community; } return parent.community; }, @@ -34,13 +34,13 @@ const serviceTicket: Resolvers = { }, requestor: async (parent, args, context, info) => { if (parent.requestor && isValidObjectId(parent.requestor.toString())) { - return (await context.dataSources.memberCosmosdbApi.findOneById(parent.requestor.toString())) as Member; + return (await context.dataSources.memberCosmosdbApi.getMemberById(parent.requestor.toString())) as Member; } return parent.requestor; }, assignedTo: async (parent, args, context, info) => { if (parent.assignedTo && isValidObjectId(parent.assignedTo.toString())) { - return (await context.dataSources.memberCosmosdbApi.findOneById(parent.assignedTo.toString())) as Member; + return (await context.dataSources.memberCosmosdbApi.getMemberById(parent.assignedTo.toString())) as Member; } return parent.assignedTo; }, @@ -54,7 +54,7 @@ const serviceTicket: Resolvers = { ServiceTicketActivityDetail: { activityBy: async (parent, args, context, info) => { if (parent.activityBy && isValidObjectId(parent.activityBy.toString())) { - return (await context.dataSources.memberCosmosdbApi.findOneById(parent.activityBy.toString())) as Member; + return (await context.dataSources.memberCosmosdbApi.getMemberById(parent.activityBy.toString())) as Member; } return parent.activityBy; }, diff --git a/src/graphql/schema/types/service.resolvers.ts b/src/graphql/schema/types/service.resolvers.ts index 1aa162a9..87310090 100644 --- a/src/graphql/schema/types/service.resolvers.ts +++ b/src/graphql/schema/types/service.resolvers.ts @@ -23,7 +23,7 @@ const service : Resolvers = { Service: { community: async (parent, args, context, info) => { if(parent.community && isValidObjectId(parent.community.toString())){ - return (await context.dataSources.communityCosmosdbApi.findOneById(parent.community.toString())) as Community; + return (await context.dataSources.communityCosmosdbApi.getCommunityById(parent.community.toString())) as Community; } return parent.community; }, diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/community.mongo-datastore.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/community.mongo-datastore.ts index c3be97be..8bf71052 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/community.mongo-datastore.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/community.mongo-datastore.ts @@ -151,7 +151,6 @@ export class MongoCommunityDatastore $replaceWith: '$c', }, ]).exec(); - // return result.map((r) => this.model.hydrate(r)); - return result.map((r) => new CommunityConverter().toDomain(r,ReadOnlyContext())); + return result.map((r) => CommunityModel.hydrate(r)); } } \ No newline at end of file From 171c85be3904517950f9b9b0681ac290969510cc Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 12:50:25 -0400 Subject: [PATCH 04/11] property data source completed --- src/graphql/data-sources/blob/properties.ts | 19 ++++--- .../data-sources/cosmos-db/properties.ts | 57 ++++++------------- .../data-sources/data-source-builder.ts | 2 +- .../data-sources/domain/service-tickets.ts | 9 +-- src/graphql/schema/types/member.resolvers.ts | 3 +- .../schema/types/property.resolvers.ts | 9 +-- .../schema/types/service-ticket.resolvers.ts | 2 +- .../infrastructure/property.domain-adapter.ts | 3 +- 8 files changed, 44 insertions(+), 60 deletions(-) diff --git a/src/graphql/data-sources/blob/properties.ts b/src/graphql/data-sources/blob/properties.ts index de3cfe52..e31c7669 100644 --- a/src/graphql/data-sources/blob/properties.ts +++ b/src/graphql/data-sources/blob/properties.ts @@ -4,6 +4,7 @@ import { PropertyConverter } from '../../../infrastructure-services-impl/datasto import { MutationStatus, PropertyBlobFileAuthHeaderResult } from '../../schema/builder/generated'; import { nanoid } from 'nanoid'; import { BlobRequestSettings } from '../../../../seedwork/services-seedwork-blob-storage-az'; +import { PropertyEntityReference } from '../../../app/domain/contexts/property/property'; interface FileInfo { fileName: string; @@ -17,11 +18,11 @@ export class Properties extends BlobDataSource { public async propertyPublicFileRemove(propertyId: string,memberId: string, fileName: string): Promise { const blobName = `public-files/${fileName}`; await this.withStorage(async (passport, blobStorage) => { - let property = await(await this.context.dataSources.propertyCosmosdbApi.findOneById(propertyId)).populate(['community', 'owner']); + let property = await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId); if (!property) { return; } - let propertyDO = new PropertyConverter().toDomain(property, { passport: passport }); + let propertyDO = property as PropertyEntityReference; //new PropertyConverter().toDomain(property, { passport: passport }); if (!passport.forProperty(propertyDO).determineIf((permissions) => permissions.canManageProperties || permissions.canEditOwnProperty && propertyDO.owner.id === memberId)) { return; } @@ -66,12 +67,12 @@ export class Properties extends BlobDataSource { public async propertyListingImageRemove(propertyId: string, memberId: string, blobName: string): Promise { let mutationResult: MutationStatus; await this.withStorage(async (passport, blobStorage) => { - let property = await (await this.context.dataSources.propertyCosmosdbApi.findOneById(propertyId)).populate(['community', 'owner']); + let property = await (await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { mutationResult = { success: false, errorMessage: `Property not found: ${propertyId}` } as MutationStatus; return; } - let propertyDO = new PropertyConverter().toDomain(property, { passport: passport }); + let propertyDO = property as PropertyEntityReference; //new PropertyConverter().toDomain(property, { passport: passport }); if ( !passport .forProperty(propertyDO) @@ -80,7 +81,8 @@ export class Properties extends BlobDataSource { mutationResult = { success: false, errorMessage: `User does not have permission to remove images from property: ${propertyId}` } as MutationStatus; return; } - await blobStorage.deleteBlob(blobName, property.community.id); + const communityId = typeof property.community === 'string' ? property.community : property.community.id; + await blobStorage.deleteBlob(blobName, communityId); mutationResult = { success: true } as MutationStatus; }); return mutationResult; @@ -90,13 +92,13 @@ export class Properties extends BlobDataSource { let headerResult: PropertyBlobFileAuthHeaderResult; const { fileName, contentType, contentLength, maxSizeBytes } = fileInfo; await this.withStorage(async (passport, blobStorage) => { - let property = await (await this.context.dataSources.propertyCosmosdbApi.findOneById(propertyId)).populate(['community','owner']); + let property = await (await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { headerResult = { status: { success: false, errorMessage: `Property not found: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; return; } - let propertyDO = new PropertyConverter().toDomain(property, { passport: passport }); + let propertyDO = property as PropertyEntityReference; //new PropertyConverter().toDomain(property, { passport: passport }); if (!passport.forProperty(propertyDO).determineIf( (permissions) => @@ -146,7 +148,8 @@ export class Properties extends BlobDataSource { value, })); - const blobContainerName = property.community.id; + const communityId = typeof property.community === 'string' ? property.community : property.community.id; + const blobContainerName = communityId; const blobDataStorageAccountName = process.env.BLOB_ACCOUNT_NAME; const blobPath = `https://${blobDataStorageAccountName}.blob.core.windows.net/${blobContainerName}/${blobName}`; diff --git a/src/graphql/data-sources/cosmos-db/properties.ts b/src/graphql/data-sources/cosmos-db/properties.ts index b5282213..9c8b9b2c 100644 --- a/src/graphql/data-sources/cosmos-db/properties.ts +++ b/src/graphql/data-sources/cosmos-db/properties.ts @@ -1,47 +1,24 @@ -import { MemberModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; -import { Property, PropertyModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/property'; import { GraphqlContext } from '../../graphql-context'; -import { Types } from 'mongoose'; -import { CosmosDataSource } from './cosmos-data-source'; +import { DataSource } from '../data-source'; +import { PropertyDataStructure } from '../../../app/application-services/datastore'; -export class Properties extends CosmosDataSource { - async getPropertiesByCommunityId(communityId: string): Promise { - return this.findByFields({ community: communityId }); +export class Properties extends DataSource { + async getPropertiesByCommunityId(communityId: string): Promise { + return this.context.applicationServices.propertyDatastoreApi.getPropertiesByCommunityId(communityId); } - - async getPropertiesByIds(propertyIds: string[]): Promise { - return this.findManyByIds(propertyIds); + async getPropertiesByIds(propertyIds: string[]): Promise { + return this.context.applicationServices.propertyDatastoreApi.getPropertiesByIds(propertyIds); } - - async getAllProperties(): Promise { - return PropertyModel.find().exec(); + async getAllProperties(): Promise { + return this.context.applicationServices.propertyDatastoreApi.getAllProperties(); } - - async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { - let result = await MemberModel.aggregate([ - { - $match: { - community: new Types.ObjectId(communityId), - 'accounts.user': new Types.ObjectId(userId), - }, - }, - { - $lookup: { - from: 'properties', - localField: '_id', - foreignField: 'owner', - as: 'p', - }, - }, - { - $unwind: { - path: '$p', - }, - }, - { - $replaceWith: '$p', - }, - ]).exec(); - return result.map((r) => PropertyModel.hydrate(r)); + async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { + return this.context.applicationServices.propertyDatastoreApi.getPropertiesForCurrentUserByCommunityId(communityId, userId); + } + async getPropertyById(id: string): Promise { + return this.context.applicationServices.propertyDatastoreApi.getPropertyById(id); + } + async getPropertyByIdWithCommunityOwner(id: string): Promise { + return this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(id); } } diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index 133fc12c..af26cb47 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -41,7 +41,7 @@ export class DataSourceBuilder { this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ modelOrCollection: ServiceTicketModel, context }); this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, - this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ modelOrCollection: PropertyModel, context }); + this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ context });//modelOrCollection: PropertyModel, this.userDomainAPI = new UserDomainAPI({ unitOfWork: UserUnitOfWork, context }); this.communityDomainAPI = new CommunityDomainAPI({ unitOfWork: CommunityUnitOfWork, context }); this.memberDomainAPI = new MemberDomainAPI({ unitOfWork: MemberUnitOfWork, context }); diff --git a/src/graphql/data-sources/domain/service-tickets.ts b/src/graphql/data-sources/domain/service-tickets.ts index 8a8a5ba0..0ae90b43 100644 --- a/src/graphql/data-sources/domain/service-tickets.ts +++ b/src/graphql/data-sources/domain/service-tickets.ts @@ -15,6 +15,7 @@ import { ServiceConverter, ServiceDomainAdapter } from '../../../infrastructure- import { PropertyConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter'; import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; import { MemberDataStructure } from '../../../app/application-services/datastore'; +import { PropertyEntityReference } from '../../../app/domain/contexts/property/property'; type PropType = ServiceTicketDomainAdapter; type DomainType = ServiceTicketDO; @@ -31,8 +32,8 @@ export class ServiceTickets extends DomainDataSource { let serviceTicket = await repo.getById(input.serviceTicketId); if (serviceTicket.property.id !== input.propertyId) { - let property = await this.context.dataSources.propertyCosmosdbApi.findOneById(input.propertyId); - let propertyDo = new PropertyConverter().toDomain(property, { passport: ReadOnlyPassport.GetInstance() }); + let property = await this.context.dataSources.propertyCosmosdbApi.getPropertyById(input.propertyId); + let propertyDo = property as PropertyEntityReference; //new PropertyConverter().toDomain(property, { passport: ReadOnlyPassport.GetInstance() }); serviceTicket.Property=(propertyDo); } serviceTicket.Title=(input.title); diff --git a/src/graphql/schema/types/member.resolvers.ts b/src/graphql/schema/types/member.resolvers.ts index bc17e316..56d58cab 100644 --- a/src/graphql/schema/types/member.resolvers.ts +++ b/src/graphql/schema/types/member.resolvers.ts @@ -2,8 +2,9 @@ import { Resolvers, Member, Community, Role, User, MemberMutationResult } from ' import { isValidObjectId } from 'mongoose'; import { getMemberForCurrentUser } from '../resolver-helper'; import { Member as MemberDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; +import { MemberDataStructure } from '../../../app/application-services/datastore'; -const MemberMutationResolver = async (getMember: Promise): Promise => { +const MemberMutationResolver = async (getMember: Promise): Promise => { try { const temp = { status: { success: true }, member: await getMember } as MemberMutationResult; return temp; diff --git a/src/graphql/schema/types/property.resolvers.ts b/src/graphql/schema/types/property.resolvers.ts index 6a2b2596..a74e4696 100644 --- a/src/graphql/schema/types/property.resolvers.ts +++ b/src/graphql/schema/types/property.resolvers.ts @@ -3,8 +3,9 @@ import { isValidObjectId } from 'mongoose'; import { Property as PropertyDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/property'; import { getMemberForCurrentUser } from '../resolver-helper'; import { trace } from "@opentelemetry/api"; +import { PropertyDataStructure } from '../../../app/application-services/datastore'; -const PropertyMutationResolver = async (getProperty: Promise): Promise => { +const PropertyMutationResolver = async (getProperty: Promise): Promise => { try { const temp: PropertyMutationResult = { status: { success: true }, @@ -42,7 +43,7 @@ const property: Resolvers = { Query: { property: async (_parent, args, {dataSources}, _info) => { if (args.id && isValidObjectId(args.id)) { - return (await dataSources.propertyCosmosdbApi.findOneById(args.id)) as Property; + return (await dataSources.propertyCosmosdbApi.getPropertyById(args.id)) as Property; } return null; }, @@ -105,7 +106,7 @@ const property: Resolvers = { const member = await getMemberForCurrentUser(context, context.community); const result = await context.dataSources.propertyBlobAPI.propertyListingImageCreateAuthHeader(input.propertyId, input.fileName, member.id, input.contentType, input.contentLength); if (result.status.success) { - let propertyDbObj = (await (await context.dataSources.propertyCosmosdbApi.findOneById(input.propertyId)).populate('owner')) as PropertyUpdateInput; + let propertyDbObj = (await context.dataSources.propertyCosmosdbApi.getPropertyByIdWithCommunityOwner(input.propertyId)) as PropertyUpdateInput; propertyDbObj.listingDetail.images.push(result.authHeader.blobName); result.property = (await context.dataSources.propertyDomainAPI.propertyUpdate(propertyDbObj)) as Property; } @@ -116,7 +117,7 @@ const property: Resolvers = { const member = await getMemberForCurrentUser(context, context.community); const result = await context.dataSources.propertyBlobAPI.propertyFloorPlanImageCreateAuthHeader(input.propertyId, input.fileName, member.id, input.contentType, input.contentLength); if (result.status.success) { - let propertyDbObj = (await (await context.dataSources.propertyCosmosdbApi.findOneById(input.propertyId)).populate('owner')) as PropertyUpdateInput; + let propertyDbObj = (await context.dataSources.propertyCosmosdbApi.getPropertyByIdWithCommunityOwner(input.propertyId)) as PropertyUpdateInput; propertyDbObj.listingDetail.floorPlanImages.push(result.authHeader.blobName); result.property = (await context.dataSources.propertyDomainAPI.propertyUpdate(propertyDbObj)) as Property; } diff --git a/src/graphql/schema/types/service-ticket.resolvers.ts b/src/graphql/schema/types/service-ticket.resolvers.ts index 8efa7402..671bf664 100644 --- a/src/graphql/schema/types/service-ticket.resolvers.ts +++ b/src/graphql/schema/types/service-ticket.resolvers.ts @@ -28,7 +28,7 @@ const serviceTicket: Resolvers = { }, property: async (parent, args, context, info) => { if (parent.property && isValidObjectId(parent.property.toString())) { - return (await context.dataSources.propertyCosmosdbApi.findOneById(parent.property.toString())) as Property; + return (await context.dataSources.propertyCosmosdbApi.getPropertyById(parent.property.toString())) as Property; } return parent.property; }, diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter.ts index bccd3c42..36897a81 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/property.domain-adapter.ts @@ -27,7 +27,8 @@ export class PropertyDomainAdapter extends MongooseDomainAdapter imple } } public setCommunityRef(community: CommunityEntityReference) { - this.doc.set('community', community['props']['doc']); + // this.doc.set('community', community['props']['doc']); + this.doc.set('community', community.id); } // get location() { From f610a15534cc8827f23602a8b769d076d11ef193 Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 13:34:05 -0400 Subject: [PATCH 05/11] roles data source updated --- .../community/community-permissions.ts | 15 ++++++++------ src/graphql/data-sources/cosmos-db/roles.ts | 20 +++++++++---------- .../data-sources/data-source-builder.ts | 2 +- src/graphql/data-sources/domain/members.ts | 5 +++-- src/graphql/data-sources/domain/roles.ts | 6 +++--- src/graphql/schema/types/member.resolvers.ts | 2 +- .../infrastructure/role.domain-adapter.ts | 3 ++- 7 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/app/domain/contexts/community/community-permissions.ts b/src/app/domain/contexts/community/community-permissions.ts index 35bb6769..280e70c0 100644 --- a/src/app/domain/contexts/community/community-permissions.ts +++ b/src/app/domain/contexts/community/community-permissions.ts @@ -37,12 +37,15 @@ export class CommunityPermissions extends Entity impl // using setters from TS 5.1 set canManageRolesAndPermissions(value: boolean) { - if ( - !this.visa.determineIf((permissions) => { - const value = permissions.canManageRolesAndPermissions || permissions.isSystemAccount; - return value; - }) - ) { + // if ( + // !this.visa.determineIf((permissions) => { + // const value = permissions.canManageRolesAndPermissions || permissions.isSystemAccount; + // return value; + // }) + // ) { + // throw new Error('Cannot set permission1'); + // } + if (!this.visa.determineIf((permissions) => permissions.canManageRolesAndPermissions || permissions.isSystemAccount)) { throw new Error('Cannot set permission1'); } this.props.canManageRolesAndPermissions = value; diff --git a/src/graphql/data-sources/cosmos-db/roles.ts b/src/graphql/data-sources/cosmos-db/roles.ts index 4ae0675b..dae50b74 100644 --- a/src/graphql/data-sources/cosmos-db/roles.ts +++ b/src/graphql/data-sources/cosmos-db/roles.ts @@ -1,21 +1,19 @@ /** @format */ -import { Role } from "../../../infrastructure-services-impl/datastore/mongodb/models/role"; +import { RoleDataStructure } from "../../../app/application-services/datastore"; import { GraphqlContext } from "../../graphql-context"; -import { CosmosDataSource } from "./cosmos-data-source"; +import { DataSource } from "../data-source"; -export class Roles extends CosmosDataSource { +export class Roles extends DataSource { - async getRoleById(id: string): Promise { - const roles = await this.findByFields({ community: this.context.community }) + async getRoleById(id: string): Promise { + const roles = await this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(this.context.community); return roles.find(role => role.id === id); } - - async getRoles(): Promise { - return this.findByFields({ community: this.context.community }); + async getRoles(): Promise { + return this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(this.context.community); } - - async getRolesByCommunityId(communityId: string): Promise { - return this.findByFields({ community: communityId }); + async getRolesByCommunityId(communityId: string): Promise { + return this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(communityId); } } diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index af26cb47..08d14994 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -36,7 +36,7 @@ export class DataSourceBuilder { this.propertySearchApi = new PropertySearchAPI({ context }); this.serviceTicketsSearchApi = new ServiceTicketsSearchAPI({ context }); this.userCosmosdbApi = new UserDatastoreDatasource({ modelOrCollection: UserModel, context }); - this.roleCosmosdbApi = new RoleDatastoreDatasource({ modelOrCollection: RoleModel, context }); + this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ modelOrCollection: ServiceModel, context }); this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ modelOrCollection: ServiceTicketModel, context }); this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, diff --git a/src/graphql/data-sources/domain/members.ts b/src/graphql/data-sources/domain/members.ts index c9cdf6c8..9020959f 100644 --- a/src/graphql/data-sources/domain/members.ts +++ b/src/graphql/data-sources/domain/members.ts @@ -12,6 +12,7 @@ import { UserConverter } from '../../../infrastructure-services-impl/datastore/m import { Interests } from '../../../app/domain/contexts/community/profile.value-objects'; import { CustomViewColumnsToDisplay, CustomViewFilters } from '../../../app/domain/contexts/community/custom-view.value-objects'; import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; +import { RoleEntityReference } from '../../../app/domain/contexts/community/role'; type PropType = MemberDomainAdapter; type DomainType = MemberDO; @@ -39,8 +40,8 @@ export class Members extends DomainDataSource { let member = await repo.getById(input.id); diff --git a/src/graphql/data-sources/domain/roles.ts b/src/graphql/data-sources/domain/roles.ts index 5e907e92..83f1b0e0 100644 --- a/src/graphql/data-sources/domain/roles.ts +++ b/src/graphql/data-sources/domain/roles.ts @@ -1,4 +1,4 @@ -import { Role as RoleDO } from '../../../app/domain/contexts/community/role'; +import { Role as RoleDO, RoleEntityReference } from '../../../app/domain/contexts/community/role'; import { RoleConverter, RoleDomainAdapter }from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/role.domain-adapter'; import { MongoRoleRepository } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/role.mongo-repository'; import { GraphqlContext } from '../../graphql-context'; @@ -88,8 +88,8 @@ export class Roles extends DomainDataSource { let roleDo = await repo.getById(input.roleToDelete); diff --git a/src/graphql/schema/types/member.resolvers.ts b/src/graphql/schema/types/member.resolvers.ts index 56d58cab..8678b8c0 100644 --- a/src/graphql/schema/types/member.resolvers.ts +++ b/src/graphql/schema/types/member.resolvers.ts @@ -27,7 +27,7 @@ const member: Resolvers = { }, role: async (parent, _args, context) => { if (parent.role && isValidObjectId(parent.role.toString())) { - return (await context.dataSources.roleCosmosdbApi.findOneById(parent.role.toString())) as Role; + return (await context.dataSources.roleCosmosdbApi.getRoleById(parent.role.toString())) as Role; } return parent.role; }, diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/role.domain-adapter.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/role.domain-adapter.ts index 081bf198..128c06a3 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/role.domain-adapter.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/role.domain-adapter.ts @@ -42,7 +42,8 @@ export class RoleDomainAdapter extends MongooseDomainAdapter implements Ro } } setCommunityRef(community: CommunityProps) { - this.doc.set('community', community['props']['doc']); + // this.doc.set('community', community['props']['doc']); + this.doc.set('community', community); } get isDefault() { From 5c9619292d8eca9554e2ec3ba8412c9e39a9e4ac Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 14:22:11 -0400 Subject: [PATCH 06/11] service ticket datasource updated --- .../datastore/service-ticket.interface.ts | 1 + .../datastore/service-ticket.ts | 9 ++++ .../data-sources/cosmos-db/service-tickets.ts | 49 +++++-------------- .../data-sources/data-source-builder.ts | 2 +- src/graphql/schema/types/role.resolvers.ts | 3 +- .../schema/types/service-ticket.resolvers.ts | 5 +- .../infrastructure/member.domain-adapter.ts | 2 +- .../infrastructure/member.mongo-datastore.ts | 5 +- .../service-ticket.domain-adapter.ts | 8 +-- 9 files changed, 37 insertions(+), 47 deletions(-) diff --git a/src/app/application-services/datastore/service-ticket.interface.ts b/src/app/application-services/datastore/service-ticket.interface.ts index df093ed8..7af88089 100644 --- a/src/app/application-services/datastore/service-ticket.interface.ts +++ b/src/app/application-services/datastore/service-ticket.interface.ts @@ -5,4 +5,5 @@ export interface ServiceTicketDatastoreApplicationService { getServiceTicketsOpenByRequestor(memberId: string): Promise; getServiceTicketsClosedByRequestor(memberId: string): Promise; getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise; + getServiceTicketById(id: string): Promise; } \ No newline at end of file diff --git a/src/application-services-impl/datastore/service-ticket.ts b/src/application-services-impl/datastore/service-ticket.ts index 58e60d91..b8ab581e 100644 --- a/src/application-services-impl/datastore/service-ticket.ts +++ b/src/application-services-impl/datastore/service-ticket.ts @@ -8,6 +8,15 @@ export class ServiceTicketDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl implements ServiceTicketDatastoreApplicationService { + + async getServiceTicketById(id: string): Promise { + let serviceTicketToReturn: ServiceTicketDataStructure; + await this.withDatastore(async (_passport, datastore) => { + serviceTicketToReturn = await datastore.serviceTicketDatastore.findOneById(id); + }); + return this.applyPermissionFilter([serviceTicketToReturn], this.context)[0]; + } + async getServiceTicketsByCommunityId(communityId: string): Promise { let serviceTicketToReturn: ServiceTicketDataStructure[]; await this.withDatastore(async (_passport, datastore) => { diff --git a/src/graphql/data-sources/cosmos-db/service-tickets.ts b/src/graphql/data-sources/cosmos-db/service-tickets.ts index f7588f4a..7e9c8874 100644 --- a/src/graphql/data-sources/cosmos-db/service-tickets.ts +++ b/src/graphql/data-sources/cosmos-db/service-tickets.ts @@ -1,46 +1,23 @@ -import { ServiceTicketConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter'; -import { ServiceTicket, ServiceTicketModel } from '../../../infrastructure-services-impl/datastore/mongodb/models/service-ticket'; +import { ServiceTicketDataStructure } from '../../../app/application-services/datastore'; import { GraphqlContext } from '../../graphql-context'; -import { CosmosDataSource } from './cosmos-data-source'; +import { DataSource } from '../data-source'; -export class ServiceTickets extends CosmosDataSource { - async getServiceTicketsByCommunityId(communityId: string): Promise { - let dbData = await ServiceTicketModel.find({ community: communityId }).populate(['community', 'property', 'requestor', 'assignedTo']).exec(); - - //(await this.collection.find({community: communityId})).. // await this.findByFields({community: communityId}); - return this.applyPermissionFilter(dbData, this.context); +export class ServiceTickets extends DataSource { + async getServiceTicketsByCommunityId(communityId: string): Promise { + return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsByCommunityId(communityId); } - async getServiceTicketsOpenByRequestor(memberId: string): Promise { - let dbData = await ServiceTicketModel.find({ requestor: memberId }).populate(['community', 'property', 'requestor', 'assignedTo']).exec(); - return this.applyPermissionFilter(dbData, this.context); + async getServiceTicketsOpenByRequestor(memberId: string): Promise { + return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsOpenByRequestor(memberId); } - async getServiceTicketsClosedByRequestor(memberId: string): Promise { - let dbData = (await this.findByFields({ requestor: memberId })).filter((ticket) => ticket.status === 'CLOSED'); - return this.applyPermissionFilter(dbData, this.context); + async getServiceTicketsClosedByRequestor(memberId: string): Promise { + return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsClosedByRequestor(memberId); } - async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { - let dbData = await this.findByFields({ community: communityId, assignedTo: memberId }); - return this.applyPermissionFilter(dbData, this.context); + async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { + return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsByAssignedTo(communityId, memberId); } - - private async applyPermissionFilter(serviceTickets: ServiceTicket[], context: GraphqlContext): Promise { - let converter = new ServiceTicketConverter(); - - return (await Promise.all(serviceTickets.map((ticket) => ticket))) //.populate(['community','property','requestor','assignedTo'])))) - .map((ticket) => converter.toDomain(ticket, context)) - .filter((ticket) => - context.passport - .forServiceTicket(ticket) - .determineIf( - (permissions) => - permissions.canManageTickets || - permissions.canAssignTickets || - (permissions.canCreateTickets && permissions.isEditingOwnTicket) || - (permissions.canWorkOnTickets && permissions.isEditingAssignedTicket) - ) - ) - .map((ticket) => converter.toPersistence(ticket)); + async getServiceTicketById(id: string): Promise { + return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketById(id); } } diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index 08d14994..6a814c6d 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -38,7 +38,7 @@ export class DataSourceBuilder { this.userCosmosdbApi = new UserDatastoreDatasource({ modelOrCollection: UserModel, context }); this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ modelOrCollection: ServiceModel, context }); - this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ modelOrCollection: ServiceTicketModel, context }); + this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ context });//modelOrCollection: ServiceTicketModel, this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ context });//modelOrCollection: PropertyModel, diff --git a/src/graphql/schema/types/role.resolvers.ts b/src/graphql/schema/types/role.resolvers.ts index 6b320ff2..5d35ffc4 100644 --- a/src/graphql/schema/types/role.resolvers.ts +++ b/src/graphql/schema/types/role.resolvers.ts @@ -1,8 +1,9 @@ import { Resolvers, Role, Community, RoleMutationResult } from '../builder/generated'; import { isValidObjectId } from 'mongoose'; import { Role as RoleDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/role'; +import { RoleDataStructure } from '../../../app/application-services/datastore'; -const RoleMutationResolver = async (getRole: Promise): Promise => { +const RoleMutationResolver = async (getRole: Promise): Promise => { try { return { status: { success: true }, diff --git a/src/graphql/schema/types/service-ticket.resolvers.ts b/src/graphql/schema/types/service-ticket.resolvers.ts index 671bf664..91c55c6a 100644 --- a/src/graphql/schema/types/service-ticket.resolvers.ts +++ b/src/graphql/schema/types/service-ticket.resolvers.ts @@ -2,8 +2,9 @@ import { Community, Member, Property, Resolvers,Service, ServiceTicket, ServiceT import { getMemberForCurrentUser } from '../resolver-helper'; import { isValidObjectId } from 'mongoose'; import { ServiceTicket as ServiceTicketDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/service-ticket'; +import { ServiceTicketDataStructure } from '../../../app/application-services/datastore'; -const ServiceTicketMutationResolver = async (getServiceTicket: Promise): Promise => { +const ServiceTicketMutationResolver = async (getServiceTicket: Promise): Promise => { try { return { status: { success: true }, @@ -61,7 +62,7 @@ const serviceTicket: Resolvers = { }, Query: { serviceTicket: async (_parent, args, context, _info) => { - return (await context.dataSources.serviceTicketCosmosdbApi.findOneById(args.id)) as ServiceTicket; + return (await context.dataSources.serviceTicketCosmosdbApi.getServiceTicketById(args.id)) as ServiceTicket; }, serviceTicketsOpenByCommunity: async (_parent, _args, context, _info) => { return (await context.dataSources.serviceTicketCosmosdbApi.getServiceTicketsByCommunityId(context.community)) as ServiceTicket[]; diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter.ts index 18ef127c..aa7f04e9 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.domain-adapter.ts @@ -88,7 +88,7 @@ export class AccountDomainAdapter implements AccountProps { } } setUserRef(user: UserEntityReference) { - this.doc.set('user', user['props']['doc']); + this.doc.set('user', user.id); } get statusCode() { diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.mongo-datastore.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.mongo-datastore.ts index 4314527d..04bf9fcf 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.mongo-datastore.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/member.mongo-datastore.ts @@ -38,8 +38,9 @@ export class MongoMemberDatastore $replaceWith: '$m', }, ]).exec(); - console.log(`getMembersAssignableToTickets`, result); - return result; + return result.map((r) => MemberModel.hydrate(r)); + // console.log(`getMembersAssignableToTickets`, result); + // return result; // return result.map((r) => new MemberConverter().toDomain(r, ReadOnlyContext())); } diff --git a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter.ts b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter.ts index b947ae78..ab64b63c 100644 --- a/src/infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter.ts +++ b/src/infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter.ts @@ -51,7 +51,7 @@ export class ServiceTicketDomainAdapter extends MongooseDomainAdapter Date: Wed, 3 Apr 2024 14:37:08 -0400 Subject: [PATCH 07/11] fixed service ticket changes --- src/application-services-impl/datastore/service-ticket.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/application-services-impl/datastore/service-ticket.ts b/src/application-services-impl/datastore/service-ticket.ts index b8ab581e..bef218cc 100644 --- a/src/application-services-impl/datastore/service-ticket.ts +++ b/src/application-services-impl/datastore/service-ticket.ts @@ -14,7 +14,8 @@ export class ServiceTicketDatastoreApplicationServiceImpl await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findOneById(id); }); - return this.applyPermissionFilter([serviceTicketToReturn], this.context)[0]; + return serviceTicketToReturn; + // return this.applyPermissionFilter([serviceTicketToReturn], this.context)[0]; } async getServiceTicketsByCommunityId(communityId: string): Promise { From aa92b9a4b09e5c8e93089df645783895514a585c Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 14:45:23 -0400 Subject: [PATCH 08/11] services data source updated --- .../data-sources/cosmos-db/services.ts | 22 ++++++++----------- .../data-sources/data-source-builder.ts | 2 +- .../data-sources/domain/service-tickets.ts | 14 ++++++------ .../schema/types/service-ticket.resolvers.ts | 2 +- src/graphql/schema/types/service.resolvers.ts | 2 +- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/graphql/data-sources/cosmos-db/services.ts b/src/graphql/data-sources/cosmos-db/services.ts index 49923dd1..408cdcf7 100644 --- a/src/graphql/data-sources/cosmos-db/services.ts +++ b/src/graphql/data-sources/cosmos-db/services.ts @@ -1,19 +1,15 @@ -import { Service } from "../../../infrastructure-services-impl/datastore/mongodb/models/service"; +import { ServiceDataStructure } from "../../../app/application-services/datastore"; import { GraphqlContext } from "../../graphql-context"; -import { CosmosDataSource } from "./cosmos-data-source"; +import { DataSource } from "../data-source"; -export class Services extends CosmosDataSource { - async getServiceById(id: string): Promise { - return ( - await this.findByFields({ id: id, community: this.context.community }) - )?.[0]; +export class Services extends DataSource { + async getServiceById(id: string): Promise { + return this.context.applicationServices.serviceDatastoreApi.getServiceById(id); } - - async getServices(): Promise { - return this.findByFields({ community: this.context.community }); + async getServices(): Promise { + return this.context.applicationServices.serviceDatastoreApi.getServices(); } - - async getServicesByCommunityId(communityId: string): Promise { - return this.findByFields({ community: communityId }); + async getServicesByCommunityId(communityId: string): Promise { + return this.context.applicationServices.serviceDatastoreApi.getServicesByCommunityId(communityId); } } diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index 6a814c6d..ff6ce23d 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -37,7 +37,7 @@ export class DataSourceBuilder { this.serviceTicketsSearchApi = new ServiceTicketsSearchAPI({ context }); this.userCosmosdbApi = new UserDatastoreDatasource({ modelOrCollection: UserModel, context }); this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, - this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ modelOrCollection: ServiceModel, context }); + this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ context });//modelOrCollection: ServiceModel, this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ context });//modelOrCollection: ServiceTicketModel, this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, diff --git a/src/graphql/data-sources/domain/service-tickets.ts b/src/graphql/data-sources/domain/service-tickets.ts index 0ae90b43..53a9403d 100644 --- a/src/graphql/data-sources/domain/service-tickets.ts +++ b/src/graphql/data-sources/domain/service-tickets.ts @@ -1,5 +1,5 @@ import { ServiceTicket as ServiceTicketDO } from '../../../app/domain/contexts/service-ticket/service-ticket'; -import { Service as ServiceDO } from '../../../app/domain/contexts/service-ticket/service'; +import { Service as ServiceDO, ServiceEntityReference } from '../../../app/domain/contexts/service-ticket/service'; import { Member as MemberDO, MemberEntityReference } from '../../../app/domain/contexts/community/member'; import { ServiceTicketConverter, ServiceTicketDomainAdapter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.domain-adapter'; import { MongoServiceTicketRepository } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.mongo-repository'; @@ -46,10 +46,10 @@ export class ServiceTickets extends DomainDataSource | undefined = undefined; + let serviceDo : ServiceEntityReference; //ServiceDO | undefined = undefined; if(input.serviceId) { - let service = await this.context.dataSources.serviceCosmosdbApi.findOneById(input.serviceId); - serviceDo = new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); + let service = await this.context.applicationServices.serviceDatastoreApi.getServiceById(input.serviceId); + serviceDo = service as ServiceEntityReference; // new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); } console.log(`serviceTicketCreate:memberDO`,memberDo); @@ -72,10 +72,10 @@ export class ServiceTickets extends DomainDataSource { let serviceTicketToReturn : ServiceTicket; - let serviceDo : ServiceDO | undefined = undefined; + let serviceDo : ServiceEntityReference; //ServiceDO | undefined = undefined; if(input.serviceId) { - let service = await this.context.dataSources.serviceCosmosdbApi.findOneById(input.serviceId); - serviceDo = new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); + let service = await this.context.applicationServices.serviceDatastoreApi.getServiceById(input.serviceId); + serviceDo = service as ServiceEntityReference; // new ServiceConverter().toDomain(service,{passport:ReadOnlyPassport.GetInstance()}); } await this.withTransaction(async (repo) => { diff --git a/src/graphql/schema/types/service-ticket.resolvers.ts b/src/graphql/schema/types/service-ticket.resolvers.ts index 91c55c6a..f47dfcf6 100644 --- a/src/graphql/schema/types/service-ticket.resolvers.ts +++ b/src/graphql/schema/types/service-ticket.resolvers.ts @@ -47,7 +47,7 @@ const serviceTicket: Resolvers = { }, service: async (parent, args, context, info) => { if(parent.service && isValidObjectId(parent.service.toString())){ - return (await context.dataSources.serviceCosmosdbApi.findOneById(parent.service.toString())) as Service; + return (await context.dataSources.serviceCosmosdbApi.getServiceById(parent.service.toString())) as Service; } return parent.service; } diff --git a/src/graphql/schema/types/service.resolvers.ts b/src/graphql/schema/types/service.resolvers.ts index 87310090..40f6b0d2 100644 --- a/src/graphql/schema/types/service.resolvers.ts +++ b/src/graphql/schema/types/service.resolvers.ts @@ -30,7 +30,7 @@ const service : Resolvers = { }, Query: { service: async (_parent, args, context, _info) => { - return (await context.dataSources.serviceCosmosdbApi.findOneById(args.id)) as Service; + return (await context.dataSources.serviceCosmosdbApi.getServiceById(args.id)) as Service; }, servicesByCommunityId: async (_parent, {communityId}, context, _info) => { return (await context.dataSources.serviceCosmosdbApi.getServicesByCommunityId(communityId)) as Service[]; From 2f71d6d968f1285a46e9c2821cf168c441443f7c Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 14:50:20 -0400 Subject: [PATCH 09/11] users data source updated --- src/graphql/data-sources/cosmos-db/users.ts | 26 +++++++------------ .../data-sources/data-source-builder.ts | 2 +- .../data-sources/domain/communities.ts | 5 ++-- src/graphql/data-sources/domain/members.ts | 9 ++++--- src/graphql/schema/types/member.resolvers.ts | 4 +-- src/graphql/schema/types/user.resolvers.ts | 2 +- 6 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/graphql/data-sources/cosmos-db/users.ts b/src/graphql/data-sources/cosmos-db/users.ts index a53f45a5..d66c1a99 100644 --- a/src/graphql/data-sources/cosmos-db/users.ts +++ b/src/graphql/data-sources/cosmos-db/users.ts @@ -1,22 +1,16 @@ -import { User } from '../../../infrastructure-services-impl/datastore/mongodb/models/user'; +import { UserDataStructure } from '../../../app/application-services/datastore'; import { GraphqlContext } from '../../graphql-context'; -import { CosmosDataSource } from './cosmos-data-source'; +import { DataSource } from '../data-source'; -export class Users extends CosmosDataSource { - - async getUser(userId : string): Promise { - return this.findOneById(userId); - } +export class Users extends DataSource { - async getByExternalId(externalId : string): Promise { - return (await this.findByFields({externalId: externalId}))[0]; + async getUserById(userId : string): Promise { + return this.context.applicationServices.userDatastoreApi.getUserById(userId); } - - async getUsers(): Promise { - console.log(`getUsers:context${JSON.stringify(this.context.verifiedUser)}`); - return this.model - .find({}) - .exec(); + async getByExternalId(externalId : string): Promise { + return this.context.applicationServices.userDatastoreApi.getByExternalId(externalId); + } + async getUsers(): Promise { + return this.context.applicationServices.userDatastoreApi.getUsers(); } - } \ No newline at end of file diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index ff6ce23d..380a3ab0 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -35,7 +35,7 @@ export class DataSourceBuilder { this.propertyBlobAPI = new PropertyBlobAPI({ context }); this.propertySearchApi = new PropertySearchAPI({ context }); this.serviceTicketsSearchApi = new ServiceTicketsSearchAPI({ context }); - this.userCosmosdbApi = new UserDatastoreDatasource({ modelOrCollection: UserModel, context }); + this.userCosmosdbApi = new UserDatastoreDatasource({ context });//modelOrCollection: UserModel, this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ context });//modelOrCollection: ServiceModel, this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ context });//modelOrCollection: ServiceTicketModel, diff --git a/src/graphql/data-sources/domain/communities.ts b/src/graphql/data-sources/domain/communities.ts index 254f7c66..dc59d753 100644 --- a/src/graphql/data-sources/domain/communities.ts +++ b/src/graphql/data-sources/domain/communities.ts @@ -7,6 +7,7 @@ import { DomainDataSource } from './domain-data-source'; import { Community } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; import { UserConverter } from '../../../infrastructure-services-impl/datastore/mongodb/infrastructure/user.domain-adapter'; import { ReadOnlyContext } from '../../../app/domain/contexts/domain-execution-context'; +import { UserEntityReference } from '../../../app/domain/contexts/user/user'; type PropType = CommunityDomainAdapter; type DomainType = CommunityDO; @@ -19,8 +20,8 @@ export class Communities extends DomainDataSource { diff --git a/src/graphql/data-sources/domain/members.ts b/src/graphql/data-sources/domain/members.ts index 9020959f..6f4c0d65 100644 --- a/src/graphql/data-sources/domain/members.ts +++ b/src/graphql/data-sources/domain/members.ts @@ -13,6 +13,7 @@ import { Interests } from '../../../app/domain/contexts/community/profile.value- import { CustomViewColumnsToDisplay, CustomViewFilters } from '../../../app/domain/contexts/community/custom-view.value-objects'; import { CommunityEntityReference } from '../../../app/domain/contexts/community/community'; import { RoleEntityReference } from '../../../app/domain/contexts/community/role'; +import { UserEntityReference } from '../../../app/domain/contexts/user/user'; type PropType = MemberDomainAdapter; type DomainType = MemberDO; @@ -86,11 +87,11 @@ export class Members extends DomainDataSource { let memberToReturn: Member; - let mongoUser = await this.context.dataSources.userCosmosdbApi.findOneById(input.account.user); - let userDo = new UserConverter().toDomain(mongoUser, { passport: ReadOnlyPassport.GetInstance() }); + let user = await this.context.dataSources.userCosmosdbApi.getUserById(input.account.user); + let userDo = user as UserEntityReference; // new UserConverter().toDomain(mongoUser, { passport: ReadOnlyPassport.GetInstance() }); - let currentMongoUser = await this.context.dataSources.userCosmosdbApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); - let currentUserDo = new UserConverter().toDomain(currentMongoUser, { passport: ReadOnlyPassport.GetInstance() }); + let currentUser = await this.context.dataSources.userCosmosdbApi.getByExternalId(this.context.verifiedUser.verifiedJWT.sub); + let currentUserDo = currentUser as UserEntityReference; //new UserConverter().toDomain(currentMongoUser, { passport: ReadOnlyPassport.GetInstance() }); await this.withTransaction(async (repo) => { let member = await repo.getById(input.memberId); diff --git a/src/graphql/schema/types/member.resolvers.ts b/src/graphql/schema/types/member.resolvers.ts index 8678b8c0..b416a3f3 100644 --- a/src/graphql/schema/types/member.resolvers.ts +++ b/src/graphql/schema/types/member.resolvers.ts @@ -35,13 +35,13 @@ const member: Resolvers = { MemberAccount: { user: async (parent, _args, context) => { if (parent.user && isValidObjectId(parent.user.toString())) { - return (await context.dataSources.userCosmosdbApi.findOneById(parent.user.toString())) as User; + return (await context.dataSources.userCosmosdbApi.getUserById(parent.user.toString())) as User; } return parent.user; }, createdBy: async (parent, _args, context) => { if (parent.createdBy && isValidObjectId(parent.createdBy.toString())) { - return (await context.dataSources.userCosmosdbApi.findOneById(parent.createdBy.toString())) as User; + return (await context.dataSources.userCosmosdbApi.getUserById(parent.createdBy.toString())) as User; } return parent.createdBy; }, diff --git a/src/graphql/schema/types/user.resolvers.ts b/src/graphql/schema/types/user.resolvers.ts index 6f83b04e..72b56360 100644 --- a/src/graphql/schema/types/user.resolvers.ts +++ b/src/graphql/schema/types/user.resolvers.ts @@ -8,7 +8,7 @@ const user: Resolvers = { console.log(`user found in context with JWT: ${JSON.stringify(context.verifiedUser.verifiedJWT)}`); } console.log(`Resolver>Query>user ${args.id}`); - return (await context.dataSources.userCosmosdbApi.getUser(args.id)) as User; + return (await context.dataSources.userCosmosdbApi.getUserById(args.id)) as User; }, users: async (parent, args, context, info) => { cacheControlFromInfo(info).setCacheHint({ maxAge: 60, scope: 'PUBLIC' }); //this works, but doesn't work when setting it with a directive From 71ac4709dfc671bfd6ba22634ead82decb1d891b Mon Sep 17 00:00:00 2001 From: Mohit Gupta Date: Wed, 3 Apr 2024 19:13:21 -0400 Subject: [PATCH 10/11] comunity fix --- .../infrastructure/memory-type-converter.ts | 6 +++--- src/application-services-impl/domain/community.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/seedwork/services-seedwork-datastore-memorydb/infrastructure/memory-type-converter.ts b/seedwork/services-seedwork-datastore-memorydb/infrastructure/memory-type-converter.ts index 03583aa1..a862d123 100644 --- a/seedwork/services-seedwork-datastore-memorydb/infrastructure/memory-type-converter.ts +++ b/seedwork/services-seedwork-datastore-memorydb/infrastructure/memory-type-converter.ts @@ -1,12 +1,12 @@ // import { BaseDataStructure } from '../interfaces/base'; // import { AggregateRoot } from '../../domain-seedwork/aggregate-root'; // import { TypeConverter } from '../../domain-seedwork/type-converter'; -// import { MemoryDomainAdapterType } from './memory-domain-adapter'; +// import { EntityProps } from '../../domain-seedwork/entity'; // export abstract class MemoryTypeConverter< // ContextType, // MemoryDataStructure extends BaseDataStructure, -// DomainPropInterface extends MemoryDomainAdapterType, +// DomainPropInterface extends EntityProps, // DomainType extends AggregateRoot // > implements TypeConverter // { @@ -16,7 +16,7 @@ // ) {} // toPersistence(domainType: DomainType): MemoryDataStructure { -// return domainType.props.doc; +// return domainType.props as any as MemoryDataStructure; // } // toDomain(memoryDataStructure: MemoryDataStructure, context:ContextType): DomainType { // if(!memoryDataStructure) { return null;} diff --git a/src/application-services-impl/domain/community.ts b/src/application-services-impl/domain/community.ts index 347e7835..a94b5bc4 100644 --- a/src/application-services-impl/domain/community.ts +++ b/src/application-services-impl/domain/community.ts @@ -43,10 +43,10 @@ export class CommunityDomainApplicationServiceImpl Date: Thu, 4 Apr 2024 00:55:30 -0400 Subject: [PATCH 11/11] wip not working --- ...{app-context.ts => app-context-builder.ts} | 39 +++-- .../application-services-builder.ts | 134 ++++++++++++++++++ .../blob-storage/community.interface.ts | 16 +-- .../blob-storage/member.interface.ts | 11 +- .../blob-storage/property.interface.ts | 13 +- .../datastore/community.interface.ts | 16 +-- .../application-services/datastore/index.ts | 28 ++-- .../datastore/member.interface.ts | 18 ++- .../datastore/property.interface.ts | 16 +-- .../datastore/role.interface.ts | 10 +- .../datastore/service-ticket.interface.ts | 14 +- .../datastore/service.interface.ts | 10 +- .../datastore/user.interface.ts | 10 +- src/app/application-services/index.ts | 54 ------- .../datastore/community.ts | 8 +- .../datastore/index.ts | 14 +- .../datastore/member.ts | 10 +- .../datastore/property.ts | 10 +- .../infrastructure-services/datastore/role.ts | 4 +- .../datastore/service-ticket.ts | 6 +- .../datastore/service.ts | 4 +- .../infrastructure-services/datastore/user.ts | 6 +- src/app/infrastructure-services/index.ts | 12 +- .../_base.application-service.ts | 4 +- .../blob-storage/community.ts | 20 +-- .../blob-storage/member.ts | 18 +-- .../blob-storage/property.ts | 20 +-- .../cognitive-search/property.ts | 2 +- .../cognitive-search/service-ticket.ts | 2 +- .../datastore/community.ts | 48 +++---- .../datastore/member.ts | 39 +++-- .../datastore/property.ts | 31 ++-- .../datastore/role.ts | 19 ++- .../datastore/service-ticket.ts | 31 ++-- .../datastore/service.ts | 19 ++- .../datastore/user.ts | 19 ++- .../maps/property.ts | 2 +- .../vercel/community.ts | 2 +- .../data-sources/cosmos-db/communities.ts | 15 +- src/graphql/data-sources/cosmos-db/members.ts | 13 +- .../data-sources/cosmos-db/properties.ts | 15 +- src/graphql/data-sources/cosmos-db/roles.ts | 9 +- .../data-sources/cosmos-db/service-tickets.ts | 13 +- .../data-sources/cosmos-db/services.ts | 9 +- src/graphql/data-sources/cosmos-db/users.ts | 9 +- .../data-sources/data-source-builder.ts | 29 ++-- src/graphql/graphql-context.ts | 6 +- .../schema/types/community.resolvers.ts | 5 +- src/graphql/schema/types/member.resolvers.ts | 5 +- .../schema/types/property.resolvers.ts | 5 +- src/graphql/schema/types/role.resolvers.ts | 5 +- .../schema/types/service-ticket.resolvers.ts | 5 +- src/graphql/schema/types/service.resolvers.ts | 4 +- src/startup/application-services-builder.ts | 105 -------------- src/startup/execution-types-builder.ts | 15 ++ .../infrastructure-services-builder.ts | 8 +- 56 files changed, 487 insertions(+), 527 deletions(-) rename src/app/{app-context.ts => app-context-builder.ts} (58%) create mode 100644 src/app/application-services/application-services-builder.ts delete mode 100644 src/app/application-services/index.ts delete mode 100644 src/startup/application-services-builder.ts create mode 100644 src/startup/execution-types-builder.ts diff --git a/src/app/app-context.ts b/src/app/app-context-builder.ts similarity index 58% rename from src/app/app-context.ts rename to src/app/app-context-builder.ts index 53804db7..bbec6702 100644 --- a/src/app/app-context.ts +++ b/src/app/app-context-builder.ts @@ -1,12 +1,11 @@ import { Passport, PassportImpl, ReadOnlyPassport } from "./domain/contexts/iam/passport"; import { UserEntityReference } from "./domain/contexts/user/user"; import { MemberEntityReference } from "./domain/contexts/community/member"; -import { CommunityDataStructure } from "./application-services/datastore"; import { CommunityEntityReference } from "./domain/contexts/community/community"; -import { ApplicationServices } from "./application-services"; +import { ApplicationServices } from "./application-services/application-services-builder"; import { InfrastructureServices } from "./infrastructure-services"; import { BaseApplicationServiceExecutionContext } from "../application-services-impl/_base.application-service"; -import { ApplicationServicesBuilder } from "../startup/application-services-builder"; +import { ApplicationServicesBuilder } from "./application-services/application-services-builder"; import { DomainImpl } from "./domain/domain-impl"; export type VerifiedUser = { @@ -14,31 +13,43 @@ export type VerifiedUser = { openIdConfigKey: string; }; -export interface AppContext extends BaseApplicationServiceExecutionContext{ +export interface AppContext + extends BaseApplicationServiceExecutionContext +{ verifiedUser: VerifiedUser; communityId: string; passport: Passport; - applicationServices: ApplicationServices; - infrastructureServices: InfrastructureServices; + applicationServices: ApplicationServices; + infrastructureServices: InfrastructureServices; init(): Promise; } -export class AppContextImpl implements AppContext { +export class AppContextBuilder + implements AppContext +{ private _verifiedUser: VerifiedUser; private _communityHeader: string; - private _communityData: CommunityDataStructure + private _communityData: TDataCommunity; private _passport: Passport; - private _applicationServices: ApplicationServices; - private _infrastructureServices: InfrastructureServices; + private _applicationServices: ApplicationServices; + private _infrastructureServices: InfrastructureServices; constructor( verifiedUser: VerifiedUser, communityHeader: string, - infrastructureServices: InfrastructureServices + infrastructureServices: InfrastructureServices ) { this._verifiedUser = verifiedUser; this._communityHeader = communityHeader; - this._applicationServices = new ApplicationServicesBuilder(this); + this._applicationServices = new ApplicationServicesBuilder(this, + infrastructureServices.datastore.communityUnitOfWork, + infrastructureServices.datastore.memberUnitOfWork, + infrastructureServices.datastore.roleUnitOfWork, + infrastructureServices.datastore.propertyUnitOfWork, + infrastructureServices.datastore.serviceUnitOfWork, + infrastructureServices.datastore.serviceTicketUnitOfWork, + infrastructureServices.datastore.userUnitOfWork, + ); this._infrastructureServices = infrastructureServices; } @@ -54,11 +65,11 @@ export class AppContextImpl implements AppContext { return this._passport; } - get applicationServices(): ApplicationServices { + get applicationServices(): ApplicationServices { return this._applicationServices; } - get infrastructureServices(): InfrastructureServices { + get infrastructureServices(): InfrastructureServices { return this._infrastructureServices; } diff --git a/src/app/application-services/application-services-builder.ts b/src/app/application-services/application-services-builder.ts new file mode 100644 index 00000000..c65ba717 --- /dev/null +++ b/src/app/application-services/application-services-builder.ts @@ -0,0 +1,134 @@ +import { CommunityBlobStorageAPI, MemberBlobStorageAPI, PropertyBlobStorageAPI } from "./blob-storage" +import { PropertyCognitiveSearchAPI, ServiceTicketCognitiveSearchAPI } from "./cognitive-search"; +import { CommunityDatastoreAPI, MemberDatastoreAPI, PropertyDatastoreAPI, RoleDatastoreAPI, ServiceDatastoreAPI, ServiceTicketDatastoreAPI, UserDatastoreAPI } from "./datastore"; +import { CommunityDomainAPI, MemberDomainAPI, PropertyDomainAPI, RoleDomainAPI, ServiceDomainAPI, ServiceTicketDomainAPI, UserDomainAPI } from "./domain"; +import { PropertyMapsAPI } from "./maps"; +import { CommunityVercelAPI } from "./vercel"; + +export interface ApplicationServices< +TDataCommunity, +TDataMember, +TDataProperty, +TDataRole, +TDataService, +TDataServiceTicket, +TDataUser, +> { + communityBlobStorageApi: CommunityBlobStorageAPI; + memberBlobStorageApi: MemberBlobStorageAPI; + propertyBlobStorageApi: PropertyBlobStorageAPI; + propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; + serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; + userDatastoreApi: UserDatastoreAPI; + roleDatastoreApi: RoleDatastoreAPI; + serviceDatastoreApi: ServiceDatastoreAPI; + serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; + memberDatastoreApi: MemberDatastoreAPI; + communityDatastoreApi: CommunityDatastoreAPI; + propertyDatastoreApi: PropertyDatastoreAPI; + userDomainApi: UserDomainAPI; + communityDomainApi: CommunityDomainAPI; + memberDomainApi: MemberDomainAPI; + roleDomainApi: RoleDomainAPI; + propertyDomainApi: PropertyDomainAPI; + serviceDomainApi: ServiceDomainAPI; + serviceTicketDomainApi: ServiceTicketDomainAPI; + propertyMapApi: PropertyMapsAPI; + communityVercelApi: CommunityVercelAPI; +} + + +import { AppContext } from "../app-context-builder"; + + +import { + CommunityBlobApiImpl, + MemberBlobApiImpl, + PropertyBlobApiImpl, + PropertySearchApiImpl, + ServiceTicketSearchApiImpl, + UserDataApiImpl, + RoleDataApiImpl, + ServiceDataApiImpl, + ServiceTicketDataApiImpl, + MemberDataApiImpl, + CommunityDataApiImpl, + PropertyDataApiImpl, + UserDomainApiImpl, + CommunityDomainApiImpl, + MemberDomainApiImpl, + RoleDomainApiImpl, + PropertyDomainApiImpl, + ServiceDomainApiImpl, + ServiceTicketDomainApiImpl, + PropertyMapsApiImpl, + CommunityVercelApiImpl, + } from "../../application-services-impl"; +import { UserUnitOfWork } from "../domain/contexts/user/user.uow"; +import { CommunityUnitOfWork } from "../domain/contexts/community/community.uow"; +import { MemberUnitOfWork } from "../domain/contexts/community/member.uow"; +import { RoleUnitOfWork } from "../domain/contexts/community/role.uow"; +import { PropertyUnitOfWork } from "../domain/contexts/property/property.uow"; +import { ServiceUnitOfWork } from "../domain/contexts/service-ticket/service.uow"; +import { ServiceTicketUnitOfWork } from "../domain/contexts/service-ticket/service-ticket.uow"; + +export class ApplicationServicesBuilder< + TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser> + implements ApplicationServices +{ + + communityBlobStorageApi: CommunityBlobStorageAPI; + memberBlobStorageApi: MemberBlobStorageAPI; + propertyBlobStorageApi: PropertyBlobStorageAPI; + propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; + serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; + userDatastoreApi: UserDatastoreAPI; + roleDatastoreApi: RoleDatastoreAPI; + serviceDatastoreApi: ServiceDatastoreAPI; + serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; + memberDatastoreApi: MemberDatastoreAPI; + communityDatastoreApi: CommunityDatastoreAPI; + propertyDatastoreApi: PropertyDatastoreAPI; + userDomainApi: UserDomainAPI; + communityDomainApi: CommunityDomainAPI; + memberDomainApi: MemberDomainAPI; + roleDomainApi: RoleDomainAPI; + propertyDomainApi: PropertyDomainAPI; + serviceDomainApi: ServiceDomainAPI; + serviceTicketDomainApi: ServiceTicketDomainAPI; + propertyMapApi: PropertyMapsAPI; + communityVercelApi: CommunityVercelAPI; + + constructor( + context: AppContext, + communityUnitOfWork: CommunityUnitOfWork, + memberUnitOfWork: MemberUnitOfWork, + roleUnitOfWork: RoleUnitOfWork, + propertyUnitOfWork: PropertyUnitOfWork, + serviceUnitOfWork: ServiceUnitOfWork, + serviceTicketUnitOfWork: ServiceTicketUnitOfWork, + userUnitOfWork: UserUnitOfWork, + ) { + this.communityBlobStorageApi = new CommunityBlobApiImpl({ context }); + this.memberBlobStorageApi = new MemberBlobApiImpl({ context }); + this.propertyBlobStorageApi = new PropertyBlobApiImpl({ context }); + this.propertyCognitiveSearchApi = new PropertySearchApiImpl({ context }); + this.serviceTicketCognitiveSearchApi = new ServiceTicketSearchApiImpl({ context }); + this.userDatastoreApi = new UserDataApiImpl({ context }); + this.roleDatastoreApi = new RoleDataApiImpl({ context }); + this.serviceDatastoreApi = new ServiceDataApiImpl({ context }); + this.serviceTicketDatastoreApi = new ServiceTicketDataApiImpl({ context }); + this.memberDatastoreApi = new MemberDataApiImpl({ context }); + this.communityDatastoreApi = new CommunityDataApiImpl({ context }); + this.propertyDatastoreApi = new PropertyDataApiImpl({ context }); + this.userDomainApi = new UserDomainApiImpl({unitOfWork: userUnitOfWork, context }); + this.communityDomainApi = new CommunityDomainApiImpl({ unitOfWork: communityUnitOfWork, context }); + this.memberDomainApi = new MemberDomainApiImpl({ unitOfWork: memberUnitOfWork,context }); + this.roleDomainApi = new RoleDomainApiImpl({ unitOfWork: roleUnitOfWork,context }); + this.propertyDomainApi = new PropertyDomainApiImpl({ unitOfWork: propertyUnitOfWork,context }); + this.serviceDomainApi = new ServiceDomainApiImpl({ unitOfWork: serviceUnitOfWork,context }); + this.serviceTicketDomainApi = new ServiceTicketDomainApiImpl({ unitOfWork: serviceTicketUnitOfWork,context }); + this.propertyMapApi = new PropertyMapsApiImpl({ context }); + this.communityVercelApi = new CommunityVercelApiImpl({ context }); + } +} \ No newline at end of file diff --git a/src/app/application-services/blob-storage/community.interface.ts b/src/app/application-services/blob-storage/community.interface.ts index e1453904..a6bfd1a6 100644 --- a/src/app/application-services/blob-storage/community.interface.ts +++ b/src/app/application-services/blob-storage/community.interface.ts @@ -1,30 +1,28 @@ -import { CommunityDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/community"; -import { RoleDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/role"; import { BlobAuthHeader, FileInfo } from "../../../../seedwork/services-seedwork-blob-storage-interfaces"; import { MutationStatus } from "./_base.interfaces"; -export interface CommunityBlobStorageApplicationService { +export interface CommunityBlobStorageApplicationService { communityPublicFilesList(communityId: string): Promise; communityPublicFilesListByType(communityId: string, type: string): Promise; - communityPublicFileCreateAuthHeader(communityId: string, fileName: string, contentType: string, contentLength: number): Promise; + communityPublicFileCreateAuthHeader(communityId: string, fileName: string, contentType: string, contentLength: number): Promise>; communityPublicFileRemove(communityId: string, fileName: string): Promise; - communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise; + communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise>; } -export type CommunityBlobContentAuthHeaderResult = { +export type CommunityBlobContentAuthHeaderResult = { authHeader?: BlobAuthHeader; - community?: Community; + community?: Community; status: MutationStatus; }; -export type Community = CommunityDataStructure & { +export type Community = TDataCommunity & { domainStatus?: CommunityDomainResult; files?: FileInfo[]; filesByType?: FileInfo[]; publicContentBlobUrl?: string; - roles?: RoleDataStructure[]; + roles?: TDataRole[]; userIsAdmin?: boolean; }; diff --git a/src/app/application-services/blob-storage/member.interface.ts b/src/app/application-services/blob-storage/member.interface.ts index 7fb1e0e4..0397d230 100644 --- a/src/app/application-services/blob-storage/member.interface.ts +++ b/src/app/application-services/blob-storage/member.interface.ts @@ -1,17 +1,16 @@ -import { MemberDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/member"; import { BlobAuthHeader } from "../../../../seedwork/services-seedwork-blob-storage-interfaces"; import { MutationStatus } from "./_base.interfaces"; -export interface MemberBlobStorageApplicationService { +export interface MemberBlobStorageApplicationService { memberProfileAvatarRemove(memberId: string): Promise; - memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise; + memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise>; } -export type MemberAvatarImageAuthHeaderResult = { +export type MemberAvatarImageAuthHeaderResult = { authHeader?: BlobAuthHeader; - member?: Member; + member?: TDataMember; status: MutationStatus; }; -export type Member = MemberDataStructure \ No newline at end of file +// export type Member = MemberDataStructure \ No newline at end of file diff --git a/src/app/application-services/blob-storage/property.interface.ts b/src/app/application-services/blob-storage/property.interface.ts index 38f6fd5e..5ef7d004 100644 --- a/src/app/application-services/blob-storage/property.interface.ts +++ b/src/app/application-services/blob-storage/property.interface.ts @@ -1,20 +1,19 @@ -import { PropertyDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/property"; import { BlobAuthHeader } from "../../../../seedwork/services-seedwork-blob-storage-interfaces"; import { MutationStatus } from "./_base.interfaces"; -export interface PropertyBlobStorageApplicationService { +export interface PropertyBlobStorageApplicationService { propertyPublicFileRemove(propertyId: string,memberId: string, fileName: string): Promise; - propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise; - propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise; + propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise>; + propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise>; propertyListingImageRemove(propertyId: string, memberId: string, blobName: string): Promise; } -export type PropertyBlobFileAuthHeaderResult = { +export type PropertyBlobFileAuthHeaderResult = { authHeader?: BlobAuthHeader; - property?: Property; + property?: Property; status: MutationStatus; }; -export type Property = PropertyDataStructure & { +export type Property = TDataProperty & { mapSASToken?: string; }; \ No newline at end of file diff --git a/src/app/application-services/datastore/community.interface.ts b/src/app/application-services/datastore/community.interface.ts index 971156ba..a546c97c 100644 --- a/src/app/application-services/datastore/community.interface.ts +++ b/src/app/application-services/datastore/community.interface.ts @@ -1,11 +1,9 @@ -import { CommunityDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/community"; - -export interface CommunityDatastoreApplicationService { - getCurrentCommunity(): Promise; - getCommunityById(communityId: string): Promise; - getCommunityByHandle(handle: string): Promise; - getCommunityByDomain(domain: string): Promise; - getCommunityByHeader(header: string): Promise; +export interface CommunityDatastoreApplicationService { + getCurrentCommunity(): Promise; + getCommunityById(communityId: string): Promise; + getCommunityByHandle(handle: string): Promise; + getCommunityByDomain(domain: string): Promise; + getCommunityByHeader(header: string): Promise; userIsAdmin(communityId: string): Promise; - getCommunitiesForCurrentUser(): Promise; + getCommunitiesForCurrentUser(): Promise; } diff --git a/src/app/application-services/datastore/index.ts b/src/app/application-services/datastore/index.ts index 157cc629..7e92ed01 100644 --- a/src/app/application-services/datastore/index.ts +++ b/src/app/application-services/datastore/index.ts @@ -1,38 +1,38 @@ // user import { UserDatastoreApplicationService } from './user.interface'; -import { UserDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/user'; +// import { UserDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/user'; // community import { CommunityDatastoreApplicationService } from './community.interface'; -import { CommunityDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/community'; +// import { CommunityDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/community'; // member import { MemberDatastoreApplicationService } from './member.interface'; -import { MemberDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/member'; +// import { MemberDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/member'; // role import { RoleDatastoreApplicationService } from './role.interface'; -import { RoleDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/role'; +// import { RoleDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/role'; // property import { PropertyDatastoreApplicationService } from './property.interface'; -import { PropertyDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/property'; +// import { PropertyDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/property'; // service import { ServiceDatastoreApplicationService } from './service.interface'; -import { ServiceDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/service'; +// import { ServiceDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/service'; // service-ticket import { ServiceTicketDatastoreApplicationService } from './service-ticket.interface'; -import { ServiceTicketDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/service-ticket'; +// import { ServiceTicketDataStructure } from '../../../infrastructure-services-impl/datastore/data-structures/service-ticket'; export { UserDatastoreApplicationService as UserDatastoreAPI, - UserDataStructure, + // UserDataStructure, CommunityDatastoreApplicationService as CommunityDatastoreAPI, - CommunityDataStructure, + // CommunityDataStructure, MemberDatastoreApplicationService as MemberDatastoreAPI, - MemberDataStructure, + // MemberDataStructure, RoleDatastoreApplicationService as RoleDatastoreAPI, - RoleDataStructure, + // RoleDataStructure, PropertyDatastoreApplicationService as PropertyDatastoreAPI, - PropertyDataStructure, + // PropertyDataStructure, ServiceDatastoreApplicationService as ServiceDatastoreAPI, - ServiceDataStructure, + // ServiceDataStructure, ServiceTicketDatastoreApplicationService as ServiceTicketDatastoreAPI, - ServiceTicketDataStructure, + // ServiceTicketDataStructure, } \ No newline at end of file diff --git a/src/app/application-services/datastore/member.interface.ts b/src/app/application-services/datastore/member.interface.ts index 7040c63b..50e36e82 100644 --- a/src/app/application-services/datastore/member.interface.ts +++ b/src/app/application-services/datastore/member.interface.ts @@ -1,11 +1,9 @@ -import { MemberDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/member"; - -export interface MemberDatastoreApplicationService { - getMemberByCommunityIdUserId(communityId: string, userId: string): Promise; - getMembers(): Promise; - getMembersByCommunityId(communityId: string): Promise; - getMembersAssignableToTickets(): Promise; - getMemberByIdWithCommunity(memberId: string): Promise; - getMemberById(memberId: string): Promise; - getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise; +export interface MemberDatastoreApplicationService { + getMemberByCommunityIdUserId(communityId: string, userId: string): Promise; + getMembers(): Promise; + getMembersByCommunityId(communityId: string): Promise; + getMembersAssignableToTickets(): Promise; + getMemberByIdWithCommunity(memberId: string): Promise; + getMemberById(memberId: string): Promise; + getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise; } \ No newline at end of file diff --git a/src/app/application-services/datastore/property.interface.ts b/src/app/application-services/datastore/property.interface.ts index 9954459d..a8a435f0 100644 --- a/src/app/application-services/datastore/property.interface.ts +++ b/src/app/application-services/datastore/property.interface.ts @@ -1,10 +1,8 @@ -import { PropertyDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/property"; - -export interface PropertyDatastoreApplicationService { - getPropertiesByCommunityId(communityId: string): Promise; - getPropertiesByIds(propertyIds: string[]): Promise; - getAllProperties(): Promise; - getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise; - getPropertyByIdWithCommunityOwner(propertyId: string): Promise; - getPropertyById(propertyId: string): Promise; +export interface PropertyDatastoreApplicationService { + getPropertiesByCommunityId(communityId: string): Promise; + getPropertiesByIds(propertyIds: string[]): Promise; + getAllProperties(): Promise; + getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise; + getPropertyByIdWithCommunityOwner(propertyId: string): Promise; + getPropertyById(propertyId: string): Promise; } \ No newline at end of file diff --git a/src/app/application-services/datastore/role.interface.ts b/src/app/application-services/datastore/role.interface.ts index 3cf6eca4..0552ec0b 100644 --- a/src/app/application-services/datastore/role.interface.ts +++ b/src/app/application-services/datastore/role.interface.ts @@ -1,7 +1,5 @@ -import { RoleDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/role"; - -export interface RoleDatastoreApplicationService { - getRoleById(id: string): Promise; - getRoles(): Promise; - getRolesByCommunityId(communityId: string): Promise; +export interface RoleDatastoreApplicationService { + getRoleById(id: string): Promise; + getRoles(): Promise; + getRolesByCommunityId(communityId: string): Promise; } \ No newline at end of file diff --git a/src/app/application-services/datastore/service-ticket.interface.ts b/src/app/application-services/datastore/service-ticket.interface.ts index 7af88089..6ea61244 100644 --- a/src/app/application-services/datastore/service-ticket.interface.ts +++ b/src/app/application-services/datastore/service-ticket.interface.ts @@ -1,9 +1,7 @@ -import { ServiceTicketDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/service-ticket"; - -export interface ServiceTicketDatastoreApplicationService { - getServiceTicketsByCommunityId(communityId: string): Promise; - getServiceTicketsOpenByRequestor(memberId: string): Promise; - getServiceTicketsClosedByRequestor(memberId: string): Promise; - getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise; - getServiceTicketById(id: string): Promise; +export interface ServiceTicketDatastoreApplicationService { + getServiceTicketsByCommunityId(communityId: string): Promise; + getServiceTicketsOpenByRequestor(memberId: string): Promise; + getServiceTicketsClosedByRequestor(memberId: string): Promise; + getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise; + getServiceTicketById(id: string): Promise; } \ No newline at end of file diff --git a/src/app/application-services/datastore/service.interface.ts b/src/app/application-services/datastore/service.interface.ts index bd3330b8..a2b79e41 100644 --- a/src/app/application-services/datastore/service.interface.ts +++ b/src/app/application-services/datastore/service.interface.ts @@ -1,7 +1,5 @@ -import { ServiceDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/service"; - -export interface ServiceDatastoreApplicationService { - getServiceById(id: string): Promise; - getServices(): Promise; - getServicesByCommunityId(communityId: string): Promise; +export interface ServiceDatastoreApplicationService { + getServiceById(id: string): Promise; + getServices(): Promise; + getServicesByCommunityId(communityId: string): Promise; } \ No newline at end of file diff --git a/src/app/application-services/datastore/user.interface.ts b/src/app/application-services/datastore/user.interface.ts index 22c64edc..02975478 100644 --- a/src/app/application-services/datastore/user.interface.ts +++ b/src/app/application-services/datastore/user.interface.ts @@ -1,7 +1,5 @@ -import { UserDataStructure } from "../../../infrastructure-services-impl/datastore/data-structures/user"; - -export interface UserDatastoreApplicationService { - getUserById(userId : string): Promise; - getByExternalId(externalId : string): Promise; - getUsers(): Promise; +export interface UserDatastoreApplicationService { + getUserById(userId : string): Promise; + getByExternalId(externalId : string): Promise; + getUsers(): Promise; } \ No newline at end of file diff --git a/src/app/application-services/index.ts b/src/app/application-services/index.ts deleted file mode 100644 index c00525d9..00000000 --- a/src/app/application-services/index.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { CommunityBlobStorageAPI, MemberBlobStorageAPI, PropertyBlobStorageAPI } from "./blob-storage" -import { PropertyCognitiveSearchAPI, ServiceTicketCognitiveSearchAPI } from "./cognitive-search"; -import { CommunityDatastoreAPI, MemberDatastoreAPI, PropertyDatastoreAPI, RoleDatastoreAPI, ServiceDatastoreAPI, ServiceTicketDatastoreAPI, UserDatastoreAPI } from "./datastore"; -import { CommunityDomainAPI, MemberDomainAPI, PropertyDomainAPI, RoleDomainAPI, ServiceDomainAPI, ServiceTicketDomainAPI, UserDomainAPI } from "./domain"; -import { PropertyMapsAPI } from "./maps"; -import { CommunityVercelAPI } from "./vercel"; - -export interface ApplicationServices { - communityBlobStorageApi: CommunityBlobStorageAPI; - memberBlobStorageApi: MemberBlobStorageAPI; - propertyBlobStorageApi: PropertyBlobStorageAPI; - propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; - serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; - userDatastoreApi: UserDatastoreAPI; - roleDatastoreApi: RoleDatastoreAPI; - serviceDatastoreApi: ServiceDatastoreAPI; - serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; - memberDatastoreApi: MemberDatastoreAPI; - communityDatastoreApi: CommunityDatastoreAPI; - propertyDatastoreApi: PropertyDatastoreAPI; - userDomainApi: UserDomainAPI; - communityDomainApi: CommunityDomainAPI; - memberDomainApi: MemberDomainAPI; - roleDomainApi: RoleDomainAPI; - propertyDomainApi: PropertyDomainAPI; - serviceDomainApi: ServiceDomainAPI; - serviceTicketDomainApi: ServiceTicketDomainAPI; - propertyMapApi: PropertyMapsAPI; - communityVercelApi: CommunityVercelAPI; -} - -export { - CommunityBlobStorageAPI, - MemberBlobStorageAPI, - PropertyBlobStorageAPI, - PropertyCognitiveSearchAPI, - ServiceTicketCognitiveSearchAPI, - UserDatastoreAPI, - RoleDatastoreAPI, - ServiceDatastoreAPI, - ServiceTicketDatastoreAPI, - MemberDatastoreAPI, - CommunityDatastoreAPI, - PropertyDatastoreAPI, - UserDomainAPI, - CommunityDomainAPI, - MemberDomainAPI, - RoleDomainAPI, - PropertyDomainAPI, - ServiceDomainAPI, - ServiceTicketDomainAPI, - PropertyMapsAPI, - CommunityVercelAPI -} \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/community.ts b/src/app/infrastructure-services/datastore/community.ts index 7adc0d97..f23c5998 100644 --- a/src/app/infrastructure-services/datastore/community.ts +++ b/src/app/infrastructure-services/datastore/community.ts @@ -1,9 +1,7 @@ import { FindQueries } from "./_base"; -import { CommunityDataStructure } from "../../application-services/datastore"; -type PropType = CommunityDataStructure; -export interface CommunityDatastoreInfrastructureService extends FindQueries { - getCommunityByHeader(header: string): Promise; +export interface CommunityDatastoreInfrastructureService extends FindQueries { + getCommunityByHeader(header: string): Promise; isUserAdmin(communityId: string, externalId: string): Promise; - getCommunitiesForUser(externalId: string): Promise; + getCommunitiesForUser(externalId: string): Promise; } diff --git a/src/app/infrastructure-services/datastore/index.ts b/src/app/infrastructure-services/datastore/index.ts index e7db3e94..08a2d161 100644 --- a/src/app/infrastructure-services/datastore/index.ts +++ b/src/app/infrastructure-services/datastore/index.ts @@ -17,11 +17,11 @@ export { UserDatastoreInfrastructureService, } export interface DatastoreInfrastructureService extends DatastoreDomain, DatastoreDomainInitializeable { - communityDatastore: CommunityDatastoreInfrastructureService; - memberDatastore: MemberDatastoreInfrastructureService - roleDatastore: RoleDatastoreInfrastructureService; - propertyDatastore: PropertyDatastoreInfrastructureService; - serviceDatastore: ServiceDatastoreInfrastructureService; - serviceTicketDatastore: ServiceTicketDatastoreInfrastructureService - userDatastore: UserDatastoreInfrastructureService + communityDatastore(): CommunityDatastoreInfrastructureService; + memberDatastore(): MemberDatastoreInfrastructureService; + roleDatastore(): RoleDatastoreInfrastructureService; + propertyDatastore(): PropertyDatastoreInfrastructureService; + serviceDatastore(): ServiceDatastoreInfrastructureService; + serviceTicketDatastore(): ServiceTicketDatastoreInfrastructureService; + userDatastore(): UserDatastoreInfrastructureService; } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/member.ts b/src/app/infrastructure-services/datastore/member.ts index fb519a1a..b1a115fa 100644 --- a/src/app/infrastructure-services/datastore/member.ts +++ b/src/app/infrastructure-services/datastore/member.ts @@ -1,9 +1,7 @@ import { FindQueries } from "./_base"; -import { MemberDataStructure } from "../../application-services/datastore"; -type PropType = MemberDataStructure; -export interface MemberDatastoreInfrastructureService extends FindQueries { - getMembersAssignableToTickets(communityId: string): Promise; - getMemberByIdWithCommunity(memberId: string): Promise; - getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise; +export interface MemberDatastoreInfrastructureService extends FindQueries { + getMembersAssignableToTickets(communityId: string): Promise; + getMemberByIdWithCommunity(memberId: string): Promise; + getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise; } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/property.ts b/src/app/infrastructure-services/datastore/property.ts index 653c4ebf..08a3200e 100644 --- a/src/app/infrastructure-services/datastore/property.ts +++ b/src/app/infrastructure-services/datastore/property.ts @@ -1,9 +1,7 @@ import { FindQueries } from "./_base"; -import { PropertyDataStructure } from "../../application-services/datastore"; -type PropType = PropertyDataStructure; -export interface PropertyDatastoreInfrastructureService extends FindQueries { - getAll(): Promise; - getPropertiesByCommunityIdUserId(communityId: string, userId: string): Promise; - getPropertyByIdWithCommunityOwner(propertyId: string): Promise; +export interface PropertyDatastoreInfrastructureService extends FindQueries { + getAll(): Promise; + getPropertiesByCommunityIdUserId(communityId: string, userId: string): Promise; + getPropertyByIdWithCommunityOwner(propertyId: string): Promise; } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/role.ts b/src/app/infrastructure-services/datastore/role.ts index 790a2ae5..7dc8f137 100644 --- a/src/app/infrastructure-services/datastore/role.ts +++ b/src/app/infrastructure-services/datastore/role.ts @@ -1,6 +1,4 @@ import { FindQueries } from "./_base"; -import { RoleDataStructure } from "../../application-services/datastore"; -type PropType = RoleDataStructure; -export interface RoleDatastoreInfrastructureService extends FindQueries { +export interface RoleDatastoreInfrastructureService extends FindQueries { } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/service-ticket.ts b/src/app/infrastructure-services/datastore/service-ticket.ts index aa915505..073752af 100644 --- a/src/app/infrastructure-services/datastore/service-ticket.ts +++ b/src/app/infrastructure-services/datastore/service-ticket.ts @@ -1,7 +1,5 @@ import { FindQueries, Fields } from "./_base"; -import { ServiceTicketDataStructure } from "../../application-services/datastore"; -type PropType = ServiceTicketDataStructure; -export interface ServiceTicketDatastoreInfrastructureService extends FindQueries { - findByFieldsWithPopulatedValues(fields: Fields): Promise; +export interface ServiceTicketDatastoreInfrastructureService extends FindQueries { + findByFieldsWithPopulatedValues(fields: Fields): Promise; } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/service.ts b/src/app/infrastructure-services/datastore/service.ts index caeb709a..cad0fd5f 100644 --- a/src/app/infrastructure-services/datastore/service.ts +++ b/src/app/infrastructure-services/datastore/service.ts @@ -1,6 +1,4 @@ import { FindQueries } from "./_base"; -import { ServiceDataStructure } from "../../application-services/datastore"; -type PropType = ServiceDataStructure; -export interface ServiceDatastoreInfrastructureService extends FindQueries { +export interface ServiceDatastoreInfrastructureService extends FindQueries { } \ No newline at end of file diff --git a/src/app/infrastructure-services/datastore/user.ts b/src/app/infrastructure-services/datastore/user.ts index 5faee7e5..d2b80fd4 100644 --- a/src/app/infrastructure-services/datastore/user.ts +++ b/src/app/infrastructure-services/datastore/user.ts @@ -1,7 +1,5 @@ import { FindQueries } from "./_base"; -import { UserDataStructure } from "../../application-services/datastore"; -type PropType = UserDataStructure; -export interface UserDatastoreInfrastructureService extends FindQueries { - getAll(): Promise; +export interface UserDatastoreInfrastructureService extends FindQueries { + getAll(): Promise; } \ No newline at end of file diff --git a/src/app/infrastructure-services/index.ts b/src/app/infrastructure-services/index.ts index c0853ea1..cb50e871 100644 --- a/src/app/infrastructure-services/index.ts +++ b/src/app/infrastructure-services/index.ts @@ -5,11 +5,19 @@ import { BlobStorageInfrastructureService } from "./blob-storage"; import { DatastoreInfrastructureService } from "./datastore"; import { MapsInfrastructureService } from "./maps"; -export interface InfrastructureServices { +export interface InfrastructureServices< +TDataCommunity, +TDataMember, +TDataProperty, +TDataRole, +TDataService, +TDataServiceTicket, +TDataUser, +> { vercel: VercelInfrastructureService; contentModerator: ContentModeratorInfrastructureService; cognitiveSearch: CognitiveSearchInfrastructureService; blobStorage: BlobStorageInfrastructureService; - datastore: DatastoreInfrastructureService; + datastore: DatastoreInfrastructureService; maps: MapsInfrastructureService; } \ No newline at end of file diff --git a/src/application-services-impl/_base.application-service.ts b/src/application-services-impl/_base.application-service.ts index fec12abd..683e01bd 100644 --- a/src/application-services-impl/_base.application-service.ts +++ b/src/application-services-impl/_base.application-service.ts @@ -1,8 +1,8 @@ -import { ApplicationServices } from "../app/application-services"; +import { ApplicationServices } from "../app/application-services/application-services-builder"; import { DomainExecutionContext } from "../app/domain/contexts/domain-execution-context"; import { Passport } from "../app/domain/contexts/iam/passport"; import { InfrastructureServices } from "../app/infrastructure-services"; -import { VerifiedUser } from "../app/app-context"; +import { VerifiedUser } from "../app/app-context-builder"; export interface BaseApplicationServiceExecutionContext extends DomainExecutionContext { passport: Passport; diff --git a/src/application-services-impl/blob-storage/community.ts b/src/application-services-impl/blob-storage/community.ts index 6437fab5..e29c67c2 100644 --- a/src/application-services-impl/blob-storage/community.ts +++ b/src/application-services-impl/blob-storage/community.ts @@ -1,5 +1,5 @@ // import { BlobDataSource } from './blob-data-source'; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; // import { CommunityConverter } from '../../../infrastructure-impl/datastore/mongodb/infrastructure/community.domain-adapter'; // import { CommunityBlobContentAuthHeaderResult, FileInfo } from ''; // import { BlobRequestSettings } from '../../../services-seedwork-blob-storage-az'; @@ -9,7 +9,7 @@ import { BlobRequestSettings, FileInfo } from '../../../seedwork/services-seedwo import { CommunityEntityReference } from '../../app/domain/contexts/community/community'; import { CommunityBlobContentAuthHeaderResult } from '../../app/application-services/blob-storage/community.interface'; -export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { +export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { public async communityPublicFilesList(communityId: string): Promise { let result: FileInfo[] = []; await this.withStorage(async (passport, blobStorage) => { @@ -46,7 +46,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli fileName: string, contentType: string, contentLength: number - ): Promise { + ): Promise> { const maxSizeMb = 10; const maxSizeBytes = maxSizeMb * 1024 * 1024; const permittedContentTypes = ['image/jpeg', 'image/png', 'image/gif', 'text/plain', 'text/csv', 'application/json', 'application/pdf']; @@ -69,7 +69,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli }); } - public async communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise { + public async communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise> { const maxSizeMb = 10; const maxSizeBytes = maxSizeMb * 1024 * 1024; const permittedContentTypes = ['image/jpeg', 'image/png', 'image/gif', 'text/plain', 'text/json', 'application/json']; @@ -86,26 +86,26 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli blobName: string, fileName?: string ) { - let headerResult: CommunityBlobContentAuthHeaderResult; + let headerResult: CommunityBlobContentAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { let community = await this.context.applicationServices.communityDatastoreApi.getCommunityById(communityId); if (!community) { - headerResult = { status: { success: false, errorMessage: `Community not found: ${communityId}` } } as CommunityBlobContentAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: `Community not found: ${communityId}` } } as CommunityBlobContentAuthHeaderResult; return; } let communityDO = community as CommunityEntityReference; //new CommunityConverter().toDomain(community, { passport: passport }); if (!passport.forCommunity(communityDO).determineIf((permissions) => permissions.canManageSiteContent)) { headerResult = { status: { success: false, errorMessage: `User does not have permission to create content for community: ${communityId}` }, - } as CommunityBlobContentAuthHeaderResult; + } as CommunityBlobContentAuthHeaderResult; return; } if (!permittedContentTypes.includes(contentType)) { - headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as CommunityBlobContentAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as CommunityBlobContentAuthHeaderResult; return; } if (contentLength > maxSizeBytes) { - headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as CommunityBlobContentAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as CommunityBlobContentAuthHeaderResult; return; } @@ -158,7 +158,7 @@ export class CommunityBlobStorageApplicationServiceImpl extends BlobStorageAppli headerResult = { status: { success: true }, authHeader: { authHeader: authHeader, requestDate: requestDate, indexTags: indexKeyValues, metadataFields: metadataKeyValues, blobPath, blobName }, - } as CommunityBlobContentAuthHeaderResult; + } as CommunityBlobContentAuthHeaderResult; }); return headerResult; } diff --git a/src/application-services-impl/blob-storage/member.ts b/src/application-services-impl/blob-storage/member.ts index 3ad84224..bc533ff4 100644 --- a/src/application-services-impl/blob-storage/member.ts +++ b/src/application-services-impl/blob-storage/member.ts @@ -1,11 +1,11 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { MutationStatus } from '../../app/application-services/blob-storage/_base.interfaces'; import { BlobStorageApplicationServiceImpl } from './_blob-storage.application-service'; import { BlobAuthHeader, BlobRequestSettings } from '../../../seedwork/services-seedwork-blob-storage-interfaces'; import { MemberAvatarImageAuthHeaderResult } from '../../app/application-services/blob-storage/member.interface'; import { MemberEntityReference } from '../../app/domain/contexts/community/member'; -export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { +export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { async memberProfileAvatarRemove(memberId: string): Promise { let mutationResult: MutationStatus; await this.withStorage(async (passport, blobStorage) => { @@ -29,15 +29,15 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat return mutationResult; } - async memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise { + async memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise> { const blobContainerName = this.context.communityId; const blobDataStorageAccountName = process.env.BLOB_ACCOUNT_NAME; - let headerResult: MemberAvatarImageAuthHeaderResult; + let headerResult: MemberAvatarImageAuthHeaderResult; await this.withStorage(async (passport, blobStorage) => { let member = await (await this.context.applicationServices.memberDatastoreApi.getMemberByIdWithCommunity(memberId)); if (!member) { - headerResult = { status: { success: false, errorMessage: `Member not found: ${memberId}` } } as MemberAvatarImageAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: `Member not found: ${memberId}` } } as MemberAvatarImageAuthHeaderResult; return; } let memberDo = member as unknown as MemberEntityReference; // [MG-TBD] - remove unknown //new MemberConverter().toDomain(member, { passport: passport }); @@ -48,7 +48,7 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat ) { headerResult = { status: { success: false, errorMessage: `User does not have permission to update avatar for member: ${memberId}` }, - } as MemberAvatarImageAuthHeaderResult; + } as MemberAvatarImageAuthHeaderResult; return; } @@ -56,11 +56,11 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat const maxSizeBytes = maxSizeMb * 1024 * 1024; const permittedContentTypes = ['image/jpeg', 'image/png', 'image/gif', 'text/plain', 'text/json', 'application/json']; if (!permittedContentTypes.includes(contentType)) { - headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as MemberAvatarImageAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as MemberAvatarImageAuthHeaderResult; return; } if (contentLength > maxSizeBytes) { - headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as MemberAvatarImageAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as MemberAvatarImageAuthHeaderResult; return; } @@ -105,7 +105,7 @@ export class MemberBlobStorageApplicationServiceImpl extends BlobStorageApplicat headerResult = { status: { success: true }, authHeader: { authHeader: authHeader, requestDate: requestDate, indexTags: indexKeyValues, metadataFields: metadataKeyValues, blobPath, blobName } as BlobAuthHeader, - } as MemberAvatarImageAuthHeaderResult; + } as MemberAvatarImageAuthHeaderResult; }); return headerResult; } diff --git a/src/application-services-impl/blob-storage/property.ts b/src/application-services-impl/blob-storage/property.ts index f3b7a232..d52db316 100644 --- a/src/application-services-impl/blob-storage/property.ts +++ b/src/application-services-impl/blob-storage/property.ts @@ -1,4 +1,4 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { MutationStatus, } from '../../app/application-services/blob-storage/_base.interfaces'; import { PropertyBlobFileAuthHeaderResult } from '../../app/application-services/blob-storage/property.interface'; import { nanoid } from 'nanoid'; @@ -13,7 +13,7 @@ interface FileInfo { maxSizeBytes: number; } -export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { +export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplicationServiceImpl { public async propertyPublicFileRemove(propertyId: string,memberId: string, fileName: string): Promise { const blobName = `public-files/${fileName}`; @@ -30,7 +30,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic }); } - public async propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise { + public async propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise> { const maxSizeMb = 10; const maxSizeBytes = maxSizeMb * 1024 * 1024; const permittedContentTypes = [ @@ -47,7 +47,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic }); } - public async propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise { + public async propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise> { const maxSizeMb = 10; const maxSizeBytes = maxSizeMb * 1024 * 1024; const permittedContentTypes = [ @@ -89,12 +89,12 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic } private async getHeader(propertyId: string, memberId:string, permittedContentTypes: string[], blobName: string, fileInfo: FileInfo) { - let headerResult: PropertyBlobFileAuthHeaderResult; + let headerResult: PropertyBlobFileAuthHeaderResult; const { fileName, contentType, contentLength, maxSizeBytes } = fileInfo; await this.withStorage(async (passport, blobStorage) => { let property = await (await this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(propertyId)); if (!property) { - headerResult = { status: { success: false, errorMessage: `Property not found: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: `Property not found: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; return; } @@ -111,15 +111,15 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic ); } )) { - headerResult = { status: { success: false, errorMessage: `User does not have permission to add images to property: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: `User does not have permission to add images to property: ${propertyId}` } } as PropertyBlobFileAuthHeaderResult; return; } if (!permittedContentTypes.includes(contentType)) { - headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as PropertyBlobFileAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content type not permitted.' } } as PropertyBlobFileAuthHeaderResult; return; } if (contentLength > maxSizeBytes) { - headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as PropertyBlobFileAuthHeaderResult; + headerResult = { status: { success: false, errorMessage: 'Content length exceeds permitted limit.' } } as PropertyBlobFileAuthHeaderResult; return; } @@ -166,7 +166,7 @@ export class PropertyBlobStorageApplicationServiceImpl extends BlobStorageApplic headerResult = { status: { success: true }, authHeader: { authHeader: authHeader, requestDate: requestDate, indexTags: indexKeyValues, metadataFields: metadataKeyValues, blobPath, blobName }, - } as PropertyBlobFileAuthHeaderResult; + } as PropertyBlobFileAuthHeaderResult; }); return headerResult; } diff --git a/src/application-services-impl/cognitive-search/property.ts b/src/application-services-impl/cognitive-search/property.ts index fa6bb0d7..97662ae2 100644 --- a/src/application-services-impl/cognitive-search/property.ts +++ b/src/application-services-impl/cognitive-search/property.ts @@ -1,4 +1,4 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import dayjs from 'dayjs'; import { CognitiveSearchApplicationServiceImpl } from './_cognitive-search.application-service'; import { FilterDetail, PropertiesSearchInput, PropertySearchResult } from '../../app/application-services/cognitive-search/property.interface'; diff --git a/src/application-services-impl/cognitive-search/service-ticket.ts b/src/application-services-impl/cognitive-search/service-ticket.ts index bc886bdc..337afec7 100644 --- a/src/application-services-impl/cognitive-search/service-ticket.ts +++ b/src/application-services-impl/cognitive-search/service-ticket.ts @@ -1,6 +1,6 @@ import { FacetDetail, SearchDocumentsResult } from '../../app/application-services/cognitive-search/_base.interface'; import { ServiceTicketsSearchFilterDetail, ServiceTicketsSearchInput, ServiceTicketsSearchResult } from '../../app/application-services/cognitive-search/service-ticket.interface'; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { CognitiveSearchApplicationServiceImpl } from './_cognitive-search.application-service'; const ServiceTicketFilterNames = { diff --git a/src/application-services-impl/datastore/community.ts b/src/application-services-impl/datastore/community.ts index 52b11562..fe9a7e7c 100644 --- a/src/application-services-impl/datastore/community.ts +++ b/src/application-services-impl/datastore/community.ts @@ -1,50 +1,50 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { DatastoreApplicationServiceImpl } from './_datastore.application-service'; -import { CommunityDataStructure } from '../../app/application-services/datastore'; import { CommunityDatastoreApplicationService } from '../../app/application-services/datastore/community.interface'; +import { DatastoreInfrastructureService } from '../../app/infrastructure-services/datastore'; -export class CommunityDatastoreApplicationServiceImpl +export class CommunityDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements CommunityDatastoreApplicationService + implements CommunityDatastoreApplicationService { - async getCurrentCommunity(): Promise { - let communityToReturn: CommunityDataStructure; - await this.withDatastore(async (_passport, datastore) => { - communityToReturn = await datastore.communityDatastore.findOneById(this.context.communityId); + async getCurrentCommunity(): Promise { + let communityToReturn: TData; + await this.withDatastore(async (_passport, datastore: DatastoreInfrastructureService) => { + communityToReturn = await datastore.communityDatastore().findOneById(this.context.communityId) as TData; }); return communityToReturn; } - async getCommunityById(communityId: string): Promise { - let communityToReturn: CommunityDataStructure; + async getCommunityById(communityId: string): Promise { + let communityToReturn: TData; await this.withDatastore(async (_passport, datastore) => { - communityToReturn = await datastore.communityDatastore.findOneById(communityId); + communityToReturn = await datastore.communityDatastore().findOneById(communityId) as TData; }); return communityToReturn; } - async getCommunityByHandle(handle: string): Promise { - let communityToReturn: CommunityDataStructure; + async getCommunityByHandle(handle: string): Promise { + let communityToReturn: TData; await this.withDatastore(async (_passport, datastore) => { - communityToReturn = (await datastore.communityDatastore.findByFields({ handle: handle }))?.[0]; + communityToReturn = (await datastore.communityDatastore().findByFields({ handle: handle }))?.[0] as TData; }); return communityToReturn; } - async getCommunityByDomain(domain: string): Promise { - let communityToReturn: CommunityDataStructure; + async getCommunityByDomain(domain: string): Promise { + let communityToReturn: TData; await this.withDatastore(async (_passport, datastore) => { - communityToReturn = (await datastore.communityDatastore.findByFields({ domain: domain }))?.[0]; + communityToReturn = (await datastore.communityDatastore().findByFields({ domain: domain }))?.[0] as TData; }); return communityToReturn; } - async getCommunityByHeader(header: string): Promise { + async getCommunityByHeader(header: string): Promise { console.log('getCommunityByHeader > header: ', header); - let communityToReturn: CommunityDataStructure; + let communityToReturn: TData; await this.withDatastore(async (_passport, datastore) => { - communityToReturn = (await datastore.communityDatastore.getCommunityByHeader(header)); + communityToReturn = (await datastore.communityDatastore().getCommunityByHeader(header)) as TData; }); console.log('getCommunityByHeader > communityToReturn: ', communityToReturn); return communityToReturn; @@ -54,16 +54,16 @@ export class CommunityDatastoreApplicationServiceImpl const externalId = this.context.verifiedUser.verifiedJWT.sub; let isUserAdmin: boolean; await this.withDatastore(async (_passport, datastore) => { - isUserAdmin = await datastore.communityDatastore.isUserAdmin(communityId, externalId); + isUserAdmin = await datastore.communityDatastore().isUserAdmin(communityId, externalId); }); return isUserAdmin; } - async getCommunitiesForCurrentUser(): Promise { + async getCommunitiesForCurrentUser(): Promise { const externalId = this.context.verifiedUser.verifiedJWT.sub; - let communityToReturn: CommunityDataStructure[]; + let communityToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { - communityToReturn = await datastore.communityDatastore.getCommunitiesForUser(externalId); + communityToReturn = await datastore.communityDatastore().getCommunitiesForUser(externalId) as TData[]; }); return communityToReturn; } diff --git a/src/application-services-impl/datastore/member.ts b/src/application-services-impl/datastore/member.ts index e06a387a..983db95f 100644 --- a/src/application-services-impl/datastore/member.ts +++ b/src/application-services-impl/datastore/member.ts @@ -1,64 +1,63 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { MemberDatastoreApplicationService } from '../../app/application-services/datastore/member.interface'; import { DatastoreApplicationServiceImpl } from './_datastore.application-service'; -import { MemberDataStructure } from '../../app/application-services/datastore'; -export class MemberDatastoreApplicationServiceImpl +export class MemberDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements MemberDatastoreApplicationService + implements MemberDatastoreApplicationService { - async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { - let memberToReturn: MemberDataStructure; + async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { + let memberToReturn: TData; await this.withDatastore(async (_passport, datastore) => { - memberToReturn = (await datastore.memberDatastore.findByFields({ community: communityId, 'accounts.user': userId }))?.[0]; + memberToReturn = (await datastore.memberDatastore().findByFields({ community: communityId, 'accounts.user': userId }))?.[0] as TData; }); return memberToReturn; } - async getMembers(): Promise { - let memberToReturn: MemberDataStructure[]; + async getMembers(): Promise { + let memberToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { - memberToReturn = await datastore.memberDatastore.findByFields({ community: this.context.communityId }); + memberToReturn = await datastore.memberDatastore().findByFields({ community: this.context.communityId }) as TData[]; }); return memberToReturn; } - async getMembersByCommunityId(communityId: string): Promise { - let memberToReturn: MemberDataStructure[]; + async getMembersByCommunityId(communityId: string): Promise { + let memberToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { memberToReturn = await datastore.memberDatastore.findByFields({ community: communityId }); }); return memberToReturn; } - async getMembersAssignableToTickets(): Promise { + async getMembersAssignableToTickets(): Promise { const communityId = this.context.communityId; - let memberToReturn: MemberDataStructure[]; + let memberToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { memberToReturn = await datastore.memberDatastore.getMembersAssignableToTickets(communityId); }); return memberToReturn; } - async getMemberByIdWithCommunity(memberId: string): Promise { - let memberToReturn: MemberDataStructure; + async getMemberByIdWithCommunity(memberId: string): Promise { + let memberToReturn: TData; await this.withDatastore(async (_passport, datastore) => { memberToReturn = await datastore.memberDatastore.getMemberByIdWithCommunity(memberId); }); return memberToReturn; } - async getMemberById(memberId: string): Promise { - let memberToReturn: MemberDataStructure; + async getMemberById(memberId: string): Promise { + let memberToReturn: TData; await this.withDatastore(async (_passport, datastore) => { memberToReturn = await datastore.memberDatastore.findOneById(memberId); }); return memberToReturn; } - async getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise { - let memberToReturn: MemberDataStructure; + async getMemberByCommunityAccountWithCommunityAccountRole(communityId: string, userId: string): Promise { + let memberToReturn: TData; await this.withDatastore(async (_passport, datastore) => { memberToReturn = await datastore.memberDatastore.getMemberByCommunityAccountWithCommunityAccountRole(communityId, userId); }); diff --git a/src/application-services-impl/datastore/property.ts b/src/application-services-impl/datastore/property.ts index 78e02dd9..6cc181d6 100644 --- a/src/application-services-impl/datastore/property.ts +++ b/src/application-services-impl/datastore/property.ts @@ -1,55 +1,54 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { PropertyDatastoreApplicationService } from '../../app/application-services/datastore/property.interface'; import { DatastoreApplicationServiceImpl } from './_datastore.application-service'; -import { PropertyDataStructure } from '../../app/application-services/datastore'; -export class PropertyDatastoreApplicationServiceImpl +export class PropertyDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements PropertyDatastoreApplicationService + implements PropertyDatastoreApplicationService { - async getPropertiesByCommunityId(communityId: string): Promise { - let propertyToReturn: PropertyDataStructure[]; + async getPropertiesByCommunityId(communityId: string): Promise { + let propertyToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.findByFields({ community: communityId }); }); return propertyToReturn; } - async getPropertiesByIds(propertyIds: string[]): Promise { - let propertyToReturn: PropertyDataStructure[]; + async getPropertiesByIds(propertyIds: string[]): Promise { + let propertyToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.findManyByIds(propertyIds); }); return propertyToReturn; } - async getAllProperties(): Promise { - let propertyToReturn: PropertyDataStructure[]; + async getAllProperties(): Promise { + let propertyToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.getAll(); }); return propertyToReturn; } - async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { - let propertyToReturn: PropertyDataStructure[]; + async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { + let propertyToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.getPropertiesByCommunityIdUserId(communityId, userId); }); return propertyToReturn; } - async getPropertyByIdWithCommunityOwner(propertyId: string): Promise { - let propertyToReturn: PropertyDataStructure; + async getPropertyByIdWithCommunityOwner(propertyId: string): Promise { + let propertyToReturn: TData; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.getPropertyByIdWithCommunityOwner(propertyId); }); return propertyToReturn; } - async getPropertyById(propertyId: string): Promise { - let propertyToReturn: PropertyDataStructure; + async getPropertyById(propertyId: string): Promise { + let propertyToReturn: TData; await this.withDatastore(async (_passport, datastore) => { propertyToReturn = await datastore.propertyDatastore.findOneById(propertyId); }); diff --git a/src/application-services-impl/datastore/role.ts b/src/application-services-impl/datastore/role.ts index 2f47e719..50dc6d79 100644 --- a/src/application-services-impl/datastore/role.ts +++ b/src/application-services-impl/datastore/role.ts @@ -1,33 +1,32 @@ /** @format */ import { RoleDatastoreApplicationService } from "../../app/application-services/datastore/role.interface"; -import { RoleDataStructure } from "../../app/application-services/datastore"; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { DatastoreApplicationServiceImpl } from "./_datastore.application-service"; -export class RoleDatastoreApplicationServiceImpl +export class RoleDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements RoleDatastoreApplicationService + implements RoleDatastoreApplicationService { - async getRoleById(roleId: string): Promise { - let roleToReturn: RoleDataStructure; + async getRoleById(roleId: string): Promise { + let roleToReturn: TData; await this.withDatastore(async (_passport, datastore) => { roleToReturn = (await datastore.roleDatastore.findByFields({ id: roleId, community: this.context.communityId }))?.[0]; }); return roleToReturn; } - async getRoles(): Promise { - let roleToReturn: RoleDataStructure[]; + async getRoles(): Promise { + let roleToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { roleToReturn = await datastore.roleDatastore.findByFields({ community: this.context.communityId }); }); return roleToReturn; } - async getRolesByCommunityId(communityId: string): Promise { - let roleToReturn: RoleDataStructure[]; + async getRolesByCommunityId(communityId: string): Promise { + let roleToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { roleToReturn = await datastore.roleDatastore.findByFields({ community: communityId }); }); diff --git a/src/application-services-impl/datastore/service-ticket.ts b/src/application-services-impl/datastore/service-ticket.ts index bef218cc..17f51dda 100644 --- a/src/application-services-impl/datastore/service-ticket.ts +++ b/src/application-services-impl/datastore/service-ticket.ts @@ -1,16 +1,15 @@ -import { ServiceTicketDataStructure } from '../../app/application-services/datastore'; import { ServiceTicketDatastoreApplicationService } from '../../app/application-services/datastore/service-ticket.interface'; import { ServiceTicketEntityReference } from '../../app/domain/contexts/service-ticket/service-ticket'; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { DatastoreApplicationServiceImpl } from './_datastore.application-service'; -export class ServiceTicketDatastoreApplicationServiceImpl +export class ServiceTicketDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements ServiceTicketDatastoreApplicationService + implements ServiceTicketDatastoreApplicationService { - async getServiceTicketById(id: string): Promise { - let serviceTicketToReturn: ServiceTicketDataStructure; + async getServiceTicketById(id: string): Promise { + let serviceTicketToReturn: TData; await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findOneById(id); }); @@ -18,39 +17,39 @@ export class ServiceTicketDatastoreApplicationServiceImpl // return this.applyPermissionFilter([serviceTicketToReturn], this.context)[0]; } - async getServiceTicketsByCommunityId(communityId: string): Promise { - let serviceTicketToReturn: ServiceTicketDataStructure[]; + async getServiceTicketsByCommunityId(communityId: string): Promise { + let serviceTicketToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findByFieldsWithPopulatedValues({ community: communityId }); }); return this.applyPermissionFilter(serviceTicketToReturn, this.context); } - async getServiceTicketsOpenByRequestor(memberId: string): Promise { - let serviceTicketToReturn: ServiceTicketDataStructure[]; + async getServiceTicketsOpenByRequestor(memberId: string): Promise { + let serviceTicketToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findByFieldsWithPopulatedValues({ requestor: memberId }); }); return this.applyPermissionFilter(serviceTicketToReturn, this.context); } - async getServiceTicketsClosedByRequestor(memberId: string): Promise { - let serviceTicketToReturn: ServiceTicketDataStructure[]; + async getServiceTicketsClosedByRequestor(memberId: string): Promise { + let serviceTicketToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findByFieldsWithPopulatedValues({ requestor: memberId , status: 'CLOSED'}); }); return this.applyPermissionFilter(serviceTicketToReturn, this.context); } - async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { - let serviceTicketToReturn: ServiceTicketDataStructure[]; + async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { + let serviceTicketToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceTicketToReturn = await datastore.serviceTicketDatastore.findByFields({ community: communityId, assignedTo: memberId}); }); return this.applyPermissionFilter(serviceTicketToReturn, this.context); } - private async applyPermissionFilter(serviceTickets: ServiceTicketDataStructure[], context: AppContext): Promise { + private async applyPermissionFilter(serviceTickets: TData[], context: AppContext): Promise { return (await Promise.all(serviceTickets.map((ticket) => ticket))) .map((ticket) => ticket as unknown as ServiceTicketEntityReference) // [MG-TBD] remove unknown .filter((ticket) => @@ -64,6 +63,6 @@ export class ServiceTicketDatastoreApplicationServiceImpl (permissions.canWorkOnTickets && permissions.isEditingAssignedTicket) ) ) - .map((ticket) => ticket as unknown as ServiceTicketDataStructure); // [MG-TBD] remove unknown + .map((ticket) => ticket as unknown as TData); // [MG-TBD] remove unknown } } diff --git a/src/application-services-impl/datastore/service.ts b/src/application-services-impl/datastore/service.ts index ac6443e5..c76eef9f 100644 --- a/src/application-services-impl/datastore/service.ts +++ b/src/application-services-impl/datastore/service.ts @@ -1,30 +1,29 @@ -import { ServiceDataStructure } from "../../app/application-services/datastore"; import { ServiceDatastoreApplicationService } from "../../app/application-services/datastore/service.interface"; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { DatastoreApplicationServiceImpl } from "./_datastore.application-service"; -export class ServiceDatastoreApplicationServiceImpl +export class ServiceDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements ServiceDatastoreApplicationService + implements ServiceDatastoreApplicationService { - async getServiceById(id: string): Promise { - let serviceToReturn: ServiceDataStructure; + async getServiceById(id: string): Promise { + let serviceToReturn: TData; await this.withDatastore(async (_passport, datastore) => { serviceToReturn = (await datastore.serviceDatastore.findByFields({ id: id, community: this.context.communityId }))?.[0]; }); return serviceToReturn; } - async getServices(): Promise { - let serviceToReturn: ServiceDataStructure[]; + async getServices(): Promise { + let serviceToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceToReturn = await datastore.serviceDatastore.findByFields({ community: this.context.communityId }); }); return serviceToReturn; } - async getServicesByCommunityId(communityId: string): Promise { - let serviceToReturn: ServiceDataStructure[]; + async getServicesByCommunityId(communityId: string): Promise { + let serviceToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { serviceToReturn = await datastore.serviceDatastore.findByFields({ community: communityId }); }); diff --git a/src/application-services-impl/datastore/user.ts b/src/application-services-impl/datastore/user.ts index d026871d..3f494c7f 100644 --- a/src/application-services-impl/datastore/user.ts +++ b/src/application-services-impl/datastore/user.ts @@ -1,31 +1,30 @@ -import { UserDataStructure } from '../../app/application-services/datastore'; import { UserDatastoreApplicationService } from '../../app/application-services/datastore/user.interface'; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { DatastoreApplicationServiceImpl } from './_datastore.application-service'; -export class UserDatastoreApplicationServiceImpl +export class UserDatastoreApplicationServiceImpl extends DatastoreApplicationServiceImpl - implements UserDatastoreApplicationService + implements UserDatastoreApplicationService { - async getUserById(userId : string): Promise { - let userToReturn: UserDataStructure; + async getUserById(userId : string): Promise { + let userToReturn: TData; await this.withDatastore(async (_passport, datastore) => { userToReturn = await datastore.userDatastore.findOneById(userId); }); return userToReturn; } - async getByExternalId(externalId : string): Promise { - let userToReturn: UserDataStructure; + async getByExternalId(externalId : string): Promise { + let userToReturn: TData; await this.withDatastore(async (_passport, datastore) => { userToReturn = (await datastore.userDatastore.findByFields({externalId: externalId}))?.[0]; }); return userToReturn; } - async getUsers(): Promise { - let userToReturn: UserDataStructure[]; + async getUsers(): Promise { + let userToReturn: TData[]; await this.withDatastore(async (_passport, datastore) => { userToReturn = await datastore.userDatastore.getAll(); }); diff --git a/src/application-services-impl/maps/property.ts b/src/application-services-impl/maps/property.ts index e23058a2..3b442ec8 100644 --- a/src/application-services-impl/maps/property.ts +++ b/src/application-services-impl/maps/property.ts @@ -1,4 +1,4 @@ -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { MapsApplicationServiceImpl } from './_maps.application-service'; export class PropertyMapsApplicationServiceImpl extends MapsApplicationServiceImpl { diff --git a/src/application-services-impl/vercel/community.ts b/src/application-services-impl/vercel/community.ts index bf989888..1af8099c 100644 --- a/src/application-services-impl/vercel/community.ts +++ b/src/application-services-impl/vercel/community.ts @@ -1,5 +1,5 @@ import { DomainResponse } from '../../app/application-services/vercel/community.interface'; -import { AppContext } from '../../app/app-context'; +import { AppContext } from '../../app/app-context-builder'; import { VercelApplicationServiceImpl } from './_vercel.application-service'; export class CommunityVercelApplicationServiceImpl extends VercelApplicationServiceImpl { diff --git a/src/graphql/data-sources/cosmos-db/communities.ts b/src/graphql/data-sources/cosmos-db/communities.ts index aa6225d5..b2700bb1 100644 --- a/src/graphql/data-sources/cosmos-db/communities.ts +++ b/src/graphql/data-sources/cosmos-db/communities.ts @@ -1,28 +1,27 @@ import { GraphqlContext } from '../../graphql-context'; -import { CommunityDataStructure } from '../../../app/application-services/datastore'; import { DataSource } from '../data-source'; -export class Communities extends DataSource { +export class Communities extends DataSource { - async getCurrentCommunity(): Promise { + async getCurrentCommunity(): Promise { return this.context.applicationServices.communityDatastoreApi.getCurrentCommunity(); } - async getCommunityById(id: string): Promise { + async getCommunityById(id: string): Promise { return this.context.applicationServices.communityDatastoreApi.getCommunityById(id); } - async getCommunityByHandle(handle: string): Promise { + async getCommunityByHandle(handle: string): Promise { return this.context.applicationServices.communityDatastoreApi.getCommunityByHandle(handle); } - async getCommunityByDomain(domain: string): Promise { + async getCommunityByDomain(domain: string): Promise { return this.context.applicationServices.communityDatastoreApi.getCommunityByDomain(domain); } - async getCommunityByHeader(header: string): Promise { + async getCommunityByHeader(header: string): Promise { return this.context.applicationServices.communityDatastoreApi.getCommunityByHeader(header); } async userIsAdmin(communityId: string): Promise { return this.context.applicationServices.communityDatastoreApi.userIsAdmin(communityId); } - async getCommunitiesForCurrentUser(): Promise { + async getCommunitiesForCurrentUser(): Promise { return this.context.applicationServices.communityDatastoreApi.getCommunitiesForCurrentUser(); } } diff --git a/src/graphql/data-sources/cosmos-db/members.ts b/src/graphql/data-sources/cosmos-db/members.ts index 1afbd8d4..6e51c708 100644 --- a/src/graphql/data-sources/cosmos-db/members.ts +++ b/src/graphql/data-sources/cosmos-db/members.ts @@ -1,21 +1,20 @@ import { GraphqlContext } from '../../graphql-context'; -import { MemberDataStructure } from '../../../app/application-services/datastore'; import { DataSource } from '../data-source'; -export class Members extends DataSource { - async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { +export class Members extends DataSource { + async getMemberByCommunityIdUserId(communityId: string, userId: string): Promise { return this.context.applicationServices.memberDatastoreApi.getMemberByCommunityIdUserId(communityId, userId); } - async getMembers(): Promise { + async getMembers(): Promise { return this.context.applicationServices.memberDatastoreApi.getMembers(); } - async getMembersByCommunityId(communityId: string): Promise { + async getMembersByCommunityId(communityId: string): Promise { return this.context.applicationServices.memberDatastoreApi.getMembersByCommunityId(communityId); } - async getMembersAssignableToTickets(): Promise { + async getMembersAssignableToTickets(): Promise { return this.context.applicationServices.memberDatastoreApi.getMembersAssignableToTickets(); } - async getMemberById(memberId: string): Promise { + async getMemberById(memberId: string): Promise { return this.context.applicationServices.memberDatastoreApi.getMemberById(memberId); } } diff --git a/src/graphql/data-sources/cosmos-db/properties.ts b/src/graphql/data-sources/cosmos-db/properties.ts index 9c8b9b2c..5bfdc3db 100644 --- a/src/graphql/data-sources/cosmos-db/properties.ts +++ b/src/graphql/data-sources/cosmos-db/properties.ts @@ -1,24 +1,23 @@ import { GraphqlContext } from '../../graphql-context'; import { DataSource } from '../data-source'; -import { PropertyDataStructure } from '../../../app/application-services/datastore'; -export class Properties extends DataSource { - async getPropertiesByCommunityId(communityId: string): Promise { +export class Properties extends DataSource { + async getPropertiesByCommunityId(communityId: string): Promise { return this.context.applicationServices.propertyDatastoreApi.getPropertiesByCommunityId(communityId); } - async getPropertiesByIds(propertyIds: string[]): Promise { + async getPropertiesByIds(propertyIds: string[]): Promise { return this.context.applicationServices.propertyDatastoreApi.getPropertiesByIds(propertyIds); } - async getAllProperties(): Promise { + async getAllProperties(): Promise { return this.context.applicationServices.propertyDatastoreApi.getAllProperties(); } - async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { + async getPropertiesForCurrentUserByCommunityId(communityId: string, userId: string): Promise { return this.context.applicationServices.propertyDatastoreApi.getPropertiesForCurrentUserByCommunityId(communityId, userId); } - async getPropertyById(id: string): Promise { + async getPropertyById(id: string): Promise { return this.context.applicationServices.propertyDatastoreApi.getPropertyById(id); } - async getPropertyByIdWithCommunityOwner(id: string): Promise { + async getPropertyByIdWithCommunityOwner(id: string): Promise { return this.context.applicationServices.propertyDatastoreApi.getPropertyByIdWithCommunityOwner(id); } } diff --git a/src/graphql/data-sources/cosmos-db/roles.ts b/src/graphql/data-sources/cosmos-db/roles.ts index dae50b74..bb9c3b4a 100644 --- a/src/graphql/data-sources/cosmos-db/roles.ts +++ b/src/graphql/data-sources/cosmos-db/roles.ts @@ -1,19 +1,18 @@ /** @format */ -import { RoleDataStructure } from "../../../app/application-services/datastore"; import { GraphqlContext } from "../../graphql-context"; import { DataSource } from "../data-source"; -export class Roles extends DataSource { +export class Roles extends DataSource { - async getRoleById(id: string): Promise { + async getRoleById(id: string): Promise { const roles = await this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(this.context.community); return roles.find(role => role.id === id); } - async getRoles(): Promise { + async getRoles(): Promise { return this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(this.context.community); } - async getRolesByCommunityId(communityId: string): Promise { + async getRolesByCommunityId(communityId: string): Promise { return this.context.applicationServices.roleDatastoreApi.getRolesByCommunityId(communityId); } } diff --git a/src/graphql/data-sources/cosmos-db/service-tickets.ts b/src/graphql/data-sources/cosmos-db/service-tickets.ts index 7e9c8874..18090b12 100644 --- a/src/graphql/data-sources/cosmos-db/service-tickets.ts +++ b/src/graphql/data-sources/cosmos-db/service-tickets.ts @@ -1,23 +1,22 @@ -import { ServiceTicketDataStructure } from '../../../app/application-services/datastore'; import { GraphqlContext } from '../../graphql-context'; import { DataSource } from '../data-source'; -export class ServiceTickets extends DataSource { - async getServiceTicketsByCommunityId(communityId: string): Promise { +export class ServiceTickets extends DataSource { + async getServiceTicketsByCommunityId(communityId: string): Promise { return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsByCommunityId(communityId); } - async getServiceTicketsOpenByRequestor(memberId: string): Promise { + async getServiceTicketsOpenByRequestor(memberId: string): Promise { return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsOpenByRequestor(memberId); } - async getServiceTicketsClosedByRequestor(memberId: string): Promise { + async getServiceTicketsClosedByRequestor(memberId: string): Promise { return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsClosedByRequestor(memberId); } - async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { + async getServiceTicketsByAssignedTo(communityId: string, memberId: string): Promise { return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketsByAssignedTo(communityId, memberId); } - async getServiceTicketById(id: string): Promise { + async getServiceTicketById(id: string): Promise { return this.context.applicationServices.serviceTicketDatastoreApi.getServiceTicketById(id); } } diff --git a/src/graphql/data-sources/cosmos-db/services.ts b/src/graphql/data-sources/cosmos-db/services.ts index 408cdcf7..3cb005e4 100644 --- a/src/graphql/data-sources/cosmos-db/services.ts +++ b/src/graphql/data-sources/cosmos-db/services.ts @@ -1,15 +1,14 @@ -import { ServiceDataStructure } from "../../../app/application-services/datastore"; import { GraphqlContext } from "../../graphql-context"; import { DataSource } from "../data-source"; -export class Services extends DataSource { - async getServiceById(id: string): Promise { +export class Services extends DataSource { + async getServiceById(id: string): Promise { return this.context.applicationServices.serviceDatastoreApi.getServiceById(id); } - async getServices(): Promise { + async getServices(): Promise { return this.context.applicationServices.serviceDatastoreApi.getServices(); } - async getServicesByCommunityId(communityId: string): Promise { + async getServicesByCommunityId(communityId: string): Promise { return this.context.applicationServices.serviceDatastoreApi.getServicesByCommunityId(communityId); } } diff --git a/src/graphql/data-sources/cosmos-db/users.ts b/src/graphql/data-sources/cosmos-db/users.ts index d66c1a99..bb370ddb 100644 --- a/src/graphql/data-sources/cosmos-db/users.ts +++ b/src/graphql/data-sources/cosmos-db/users.ts @@ -1,16 +1,15 @@ -import { UserDataStructure } from '../../../app/application-services/datastore'; import { GraphqlContext } from '../../graphql-context'; import { DataSource } from '../data-source'; -export class Users extends DataSource { +export class Users extends DataSource { - async getUserById(userId : string): Promise { + async getUserById(userId : string): Promise { return this.context.applicationServices.userDatastoreApi.getUserById(userId); } - async getByExternalId(externalId : string): Promise { + async getByExternalId(externalId : string): Promise { return this.context.applicationServices.userDatastoreApi.getByExternalId(externalId); } - async getUsers(): Promise { + async getUsers(): Promise { return this.context.applicationServices.userDatastoreApi.getUsers(); } } \ No newline at end of file diff --git a/src/graphql/data-sources/data-source-builder.ts b/src/graphql/data-sources/data-source-builder.ts index 380a3ab0..f305c697 100644 --- a/src/graphql/data-sources/data-source-builder.ts +++ b/src/graphql/data-sources/data-source-builder.ts @@ -5,6 +5,7 @@ import { CommunityCosmosdbAPI, CommunityModel, MemberCosmosdbAPI, MemberModel, P import { CommunityDomainAPI, CommunityUnitOfWork, MemberDomainAPI, MemberUnitOfWork, PropertyDomainAPI, PropertyUnitOfWork, RoleDomainAPI, RoleUnitOfWork, ServiceDomainAPI, ServiceTicketDomainAPI, ServiceTicketUnitOfWork, ServiceUnitOfWork, UserDomainAPI, UserUnitOfWork } from "./domain"; import { PropertyMapAPI } from "./maps"; import { CommunityVercelAPI } from "./vercel"; +import { CommunityData, MemberData, RoleData, PropertyData, ServiceData, ServiceTicketData, UserData } from "../../startup/execution-types-builder"; export class DataSourceBuilder { communityBlobAPI: CommunityBlobAPI; @@ -12,13 +13,13 @@ export class DataSourceBuilder { propertyBlobAPI: PropertyBlobAPI; propertySearchApi: PropertySearchAPI; serviceTicketsSearchApi: ServiceTicketsSearchAPI; - userCosmosdbApi: UserDatastoreDatasource; - roleCosmosdbApi: RoleDatastoreDatasource; - serviceCosmosdbApi: ServiceCosmosdbAPI; - serviceTicketCosmosdbApi: ServiceTicketCosmosdbAPI; - memberCosmosdbApi: MemberCosmosdbAPI; - communityCosmosdbApi: CommunityCosmosdbAPI; - propertyCosmosdbApi: PropertyCosmosdbAPI; + userCosmosdbApi: UserDatastoreDatasource; + roleCosmosdbApi: RoleDatastoreDatasource; + serviceCosmosdbApi: ServiceCosmosdbAPI; + serviceTicketCosmosdbApi: ServiceTicketCosmosdbAPI; + memberCosmosdbApi: MemberCosmosdbAPI; + communityCosmosdbApi: CommunityCosmosdbAPI; + propertyCosmosdbApi: PropertyCosmosdbAPI; userDomainAPI: UserDomainAPI; communityDomainAPI: CommunityDomainAPI; memberDomainAPI: MemberDomainAPI; @@ -35,13 +36,13 @@ export class DataSourceBuilder { this.propertyBlobAPI = new PropertyBlobAPI({ context }); this.propertySearchApi = new PropertySearchAPI({ context }); this.serviceTicketsSearchApi = new ServiceTicketsSearchAPI({ context }); - this.userCosmosdbApi = new UserDatastoreDatasource({ context });//modelOrCollection: UserModel, - this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, - this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ context });//modelOrCollection: ServiceModel, - this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ context });//modelOrCollection: ServiceTicketModel, - this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, - this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, - this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ context });//modelOrCollection: PropertyModel, + this.userCosmosdbApi = new UserDatastoreDatasource({ context });//modelOrCollection: UserModel, + this.roleCosmosdbApi = new RoleDatastoreDatasource({ context });//modelOrCollection: RoleModel, + this.serviceCosmosdbApi = new ServiceCosmosdbAPI({ context });//modelOrCollection: ServiceModel, + this.serviceTicketCosmosdbApi = new ServiceTicketCosmosdbAPI({ context });//modelOrCollection: ServiceTicketModel, + this.memberCosmosdbApi = new MemberCosmosdbAPI({ context });//modelOrCollection: MemberModel, + this.communityCosmosdbApi = new CommunityCosmosdbAPI({ context });//modelOrCollection: CommunityModel, + this.propertyCosmosdbApi = new PropertyCosmosdbAPI({ context });//modelOrCollection: PropertyModel, this.userDomainAPI = new UserDomainAPI({ unitOfWork: UserUnitOfWork, context }); this.communityDomainAPI = new CommunityDomainAPI({ unitOfWork: CommunityUnitOfWork, context }); this.memberDomainAPI = new MemberDomainAPI({ unitOfWork: MemberUnitOfWork, context }); diff --git a/src/graphql/graphql-context.ts b/src/graphql/graphql-context.ts index 16cb7a08..7229362f 100644 --- a/src/graphql/graphql-context.ts +++ b/src/graphql/graphql-context.ts @@ -1,10 +1,10 @@ import { Passport } from '../app/domain/contexts/iam/passport'; import { HttpRequest } from '@azure/functions'; import { PortalTokenValidation } from '../auth/portal-token-validation'; -import { ApplicationServices } from '../app/application-services'; +import { ApplicationServices } from '../app/application-services/application-services-builder'; import { InfrastructureServices } from '../app/infrastructure-services'; import * as util from '../../seedwork/auth-seedwork-oidc/util'; -import { AppContext, AppContextImpl } from '../app/app-context'; +import { AppContext, AppContextBuilder } from '../app/app-context-builder'; import { DataSourceBuilder } from './data-sources/data-source-builder'; export type VerifiedUser = { @@ -52,7 +52,7 @@ export class GraphqlContextImpl implements GraphqlContext{ } private async setAppContext(): Promise { - this._appContext = new AppContextImpl( + this._appContext = new AppContextBuilder( this._verifiedUser, this._req.headers.get('community'), this._infrastructureServices diff --git a/src/graphql/schema/types/community.resolvers.ts b/src/graphql/schema/types/community.resolvers.ts index 08d778c3..a987e858 100644 --- a/src/graphql/schema/types/community.resolvers.ts +++ b/src/graphql/schema/types/community.resolvers.ts @@ -1,8 +1,7 @@ import { Resolvers, Community, CommunityMutationResult, Role } from '../builder/generated'; -import { Community as CommunityDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/community'; -import { CommunityDataStructure } from '../../../app/application-services/datastore'; +import { CommunityData } from '../../../startup/execution-types-builder'; -const CommunityMutationResolver = async (getCommunity: Promise): Promise => { +const CommunityMutationResolver = async (getCommunity: Promise): Promise => { try { return { status: { success: true }, diff --git a/src/graphql/schema/types/member.resolvers.ts b/src/graphql/schema/types/member.resolvers.ts index b416a3f3..f643a6da 100644 --- a/src/graphql/schema/types/member.resolvers.ts +++ b/src/graphql/schema/types/member.resolvers.ts @@ -1,10 +1,9 @@ import { Resolvers, Member, Community, Role, User, MemberMutationResult } from '../builder/generated'; import { isValidObjectId } from 'mongoose'; import { getMemberForCurrentUser } from '../resolver-helper'; -import { Member as MemberDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/member'; -import { MemberDataStructure } from '../../../app/application-services/datastore'; +import { MemberData } from '../../../startup/execution-types-builder'; -const MemberMutationResolver = async (getMember: Promise): Promise => { +const MemberMutationResolver = async (getMember: Promise): Promise => { try { const temp = { status: { success: true }, member: await getMember } as MemberMutationResult; return temp; diff --git a/src/graphql/schema/types/property.resolvers.ts b/src/graphql/schema/types/property.resolvers.ts index a74e4696..f836730d 100644 --- a/src/graphql/schema/types/property.resolvers.ts +++ b/src/graphql/schema/types/property.resolvers.ts @@ -1,11 +1,10 @@ import { Resolvers, Community, Member, Property, PropertyMutationResult, PropertyUpdateInput } from '../builder/generated'; import { isValidObjectId } from 'mongoose'; -import { Property as PropertyDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/property'; import { getMemberForCurrentUser } from '../resolver-helper'; import { trace } from "@opentelemetry/api"; -import { PropertyDataStructure } from '../../../app/application-services/datastore'; +import { PropertyData } from '../../../startup/execution-types-builder'; -const PropertyMutationResolver = async (getProperty: Promise): Promise => { +const PropertyMutationResolver = async (getProperty: Promise): Promise => { try { const temp: PropertyMutationResult = { status: { success: true }, diff --git a/src/graphql/schema/types/role.resolvers.ts b/src/graphql/schema/types/role.resolvers.ts index 5d35ffc4..313be99c 100644 --- a/src/graphql/schema/types/role.resolvers.ts +++ b/src/graphql/schema/types/role.resolvers.ts @@ -1,9 +1,8 @@ import { Resolvers, Role, Community, RoleMutationResult } from '../builder/generated'; import { isValidObjectId } from 'mongoose'; -import { Role as RoleDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/role'; -import { RoleDataStructure } from '../../../app/application-services/datastore'; +import { RoleData } from '../../../startup/execution-types-builder'; -const RoleMutationResolver = async (getRole: Promise): Promise => { +const RoleMutationResolver = async (getRole: Promise): Promise => { try { return { status: { success: true }, diff --git a/src/graphql/schema/types/service-ticket.resolvers.ts b/src/graphql/schema/types/service-ticket.resolvers.ts index f47dfcf6..746b5198 100644 --- a/src/graphql/schema/types/service-ticket.resolvers.ts +++ b/src/graphql/schema/types/service-ticket.resolvers.ts @@ -1,10 +1,9 @@ import { Community, Member, Property, Resolvers,Service, ServiceTicket, ServiceTicketMutationResult } from '../builder/generated'; import { getMemberForCurrentUser } from '../resolver-helper'; import { isValidObjectId } from 'mongoose'; -import { ServiceTicket as ServiceTicketDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/service-ticket'; -import { ServiceTicketDataStructure } from '../../../app/application-services/datastore'; +import { ServiceTicketData } from '../../../startup/execution-types-builder'; -const ServiceTicketMutationResolver = async (getServiceTicket: Promise): Promise => { +const ServiceTicketMutationResolver = async (getServiceTicket: Promise): Promise => { try { return { status: { success: true }, diff --git a/src/graphql/schema/types/service.resolvers.ts b/src/graphql/schema/types/service.resolvers.ts index 40f6b0d2..43a2fefa 100644 --- a/src/graphql/schema/types/service.resolvers.ts +++ b/src/graphql/schema/types/service.resolvers.ts @@ -1,9 +1,9 @@ import { Community, Resolvers, Service, ServiceMutationResult } from '../builder/generated'; import { isValidObjectId } from 'mongoose'; -import { Service as ServiceDo } from '../../../infrastructure-services-impl/datastore/mongodb/models/service'; +import { ServiceData } from '../../../startup/execution-types-builder'; -const ServiceMutationResolver = async (getService:Promise): Promise => { +const ServiceMutationResolver = async (getService:Promise): Promise => { try { return { status : { success: true }, diff --git a/src/startup/application-services-builder.ts b/src/startup/application-services-builder.ts deleted file mode 100644 index 6d617a4e..00000000 --- a/src/startup/application-services-builder.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ApplicationServices } from "../app/application-services"; -import { AppContext } from "../app/app-context"; -import { - CommunityBlobStorageAPI, - MemberBlobStorageAPI, - PropertyBlobStorageAPI, - PropertyCognitiveSearchAPI, - ServiceTicketCognitiveSearchAPI, - UserDatastoreAPI, - RoleDatastoreAPI, - ServiceDatastoreAPI, - ServiceTicketDatastoreAPI, - MemberDatastoreAPI, - CommunityDatastoreAPI, - PropertyDatastoreAPI, - UserDomainAPI, - CommunityDomainAPI, - MemberDomainAPI, - RoleDomainAPI, - PropertyDomainAPI, - ServiceDomainAPI, - ServiceTicketDomainAPI, - PropertyMapsAPI, - CommunityVercelAPI -} from "../app/application-services"; - -import { - CommunityBlobApiImpl, - MemberBlobApiImpl, - PropertyBlobApiImpl, - PropertySearchApiImpl, - ServiceTicketSearchApiImpl, - UserDataApiImpl, - RoleDataApiImpl, - ServiceDataApiImpl, - ServiceTicketDataApiImpl, - MemberDataApiImpl, - CommunityDataApiImpl, - PropertyDataApiImpl, - UserDomainApiImpl, - CommunityDomainApiImpl, - MemberDomainApiImpl, - RoleDomainApiImpl, - PropertyDomainApiImpl, - ServiceDomainApiImpl, - ServiceTicketDomainApiImpl, - PropertyMapsApiImpl, - CommunityVercelApiImpl, - } from "../application-services-impl"; -import { MongoUserUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/user.uow"; -import { MongoCommunityUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/community.mongo-uow"; -import { MongoMemberUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/member.mongo-uow"; -import { MongoRoleUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/role.mongo-uow"; -import { MongoPropertyUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/property.mongo-uow"; -import { MongoServiceUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/service.uow"; -import { MongoServiceTicketUnitOfWork } from "../infrastructure-services-impl/datastore/mongodb/infrastructure/service-ticket.uow"; - -export class ApplicationServicesBuilder implements ApplicationServices{ - communityBlobStorageApi: CommunityBlobStorageAPI; - memberBlobStorageApi: MemberBlobStorageAPI; - propertyBlobStorageApi: PropertyBlobStorageAPI; - propertyCognitiveSearchApi: PropertyCognitiveSearchAPI; - serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI; - userDatastoreApi: UserDatastoreAPI; - roleDatastoreApi: RoleDatastoreAPI; - serviceDatastoreApi: ServiceDatastoreAPI; - serviceTicketDatastoreApi: ServiceTicketDatastoreAPI; - memberDatastoreApi: MemberDatastoreAPI; - communityDatastoreApi: CommunityDatastoreAPI; - propertyDatastoreApi: PropertyDatastoreAPI; - userDomainApi: UserDomainAPI; - communityDomainApi: CommunityDomainAPI; - memberDomainApi: MemberDomainAPI; - roleDomainApi: RoleDomainAPI; - propertyDomainApi: PropertyDomainAPI; - serviceDomainApi: ServiceDomainAPI; - serviceTicketDomainApi: ServiceTicketDomainAPI; - propertyMapApi: PropertyMapsAPI; - communityVercelApi: CommunityVercelAPI; - - constructor(context: AppContext) { - this.communityBlobStorageApi = new CommunityBlobApiImpl({ context }); - this.memberBlobStorageApi = new MemberBlobApiImpl({ context }); - this.propertyBlobStorageApi = new PropertyBlobApiImpl({ context }); - this.propertyCognitiveSearchApi = new PropertySearchApiImpl({ context }); - this.serviceTicketCognitiveSearchApi = new ServiceTicketSearchApiImpl({ context }); - this.userDatastoreApi = new UserDataApiImpl({ context }); - this.roleDatastoreApi = new RoleDataApiImpl({ context }); - this.serviceDatastoreApi = new ServiceDataApiImpl({ context }); - this.serviceTicketDatastoreApi = new ServiceTicketDataApiImpl({ context }); - this.memberDatastoreApi = new MemberDataApiImpl({ context }); - this.communityDatastoreApi = new CommunityDataApiImpl({ context }); - this.propertyDatastoreApi = new PropertyDataApiImpl({ context }); - this.userDomainApi = new UserDomainApiImpl({unitOfWork: MongoUserUnitOfWork, context }); - this.communityDomainApi = new CommunityDomainApiImpl({ unitOfWork: MongoCommunityUnitOfWork, context }); - this.memberDomainApi = new MemberDomainApiImpl({ unitOfWork: MongoMemberUnitOfWork,context }); - this.roleDomainApi = new RoleDomainApiImpl({ unitOfWork: MongoRoleUnitOfWork,context }); - this.propertyDomainApi = new PropertyDomainApiImpl({ unitOfWork: MongoPropertyUnitOfWork,context }); - this.serviceDomainApi = new ServiceDomainApiImpl({ unitOfWork: MongoServiceUnitOfWork,context }); - this.serviceTicketDomainApi = new ServiceTicketDomainApiImpl({ unitOfWork: MongoServiceTicketUnitOfWork,context }); - this.propertyMapApi = new PropertyMapsApiImpl({ context }); - this.communityVercelApi = new CommunityVercelApiImpl({ context }); - } - -} \ No newline at end of file diff --git a/src/startup/execution-types-builder.ts b/src/startup/execution-types-builder.ts new file mode 100644 index 00000000..e15f2896 --- /dev/null +++ b/src/startup/execution-types-builder.ts @@ -0,0 +1,15 @@ +import { Community } from "../infrastructure-services-impl/datastore/mongodb/models/community"; +import { Member } from "../infrastructure-services-impl/datastore/mongodb/models/member"; +import { Role } from "../infrastructure-services-impl/datastore/mongodb/models/role"; +import { Property } from "../infrastructure-services-impl/datastore/mongodb/models/property"; +import { Service } from "../infrastructure-services-impl/datastore/mongodb/models/service"; +import { ServiceTicket } from "../infrastructure-services-impl/datastore/mongodb/models/service-ticket"; +import { User } from "../infrastructure-services-impl/datastore/mongodb/models/user"; + +export type CommunityData = Community +export type MemberData = Member +export type RoleData = Role +export type PropertyData = Property +export type ServiceData = Service +export type ServiceTicketData = ServiceTicket +export type UserData = User \ No newline at end of file diff --git a/src/startup/infrastructure-services-builder.ts b/src/startup/infrastructure-services-builder.ts index ceeb98ac..6686e1ab 100644 --- a/src/startup/infrastructure-services-builder.ts +++ b/src/startup/infrastructure-services-builder.ts @@ -18,12 +18,12 @@ import { MapsInfrastructureService } from '../app/infrastructure-services/maps'; // import { MongoServiceUnitOfWork } from '../infrastructure-impl/datastore/mongodb/infrastructure/service.uow'; // import { MongoServiceTicketUnitOfWork } from '../infrastructure-impl/datastore/mongodb/infrastructure/service-ticket.uow'; -export class InfrastructureServicesBuilder implements InfrastructureServices{ +export class InfrastructureServicesBuilder implements InfrastructureServices{ private _vercel: VercelInfrastructureService; private _contentModerator: ContentModeratorInfrastructureService; private _cognitiveSearch: CognitiveSearchInfrastructureService; private _blobStorage: BlobStorageInfrastructureService; - private _datastore: DatastoreInfrastructureService; + private _datastore: DatastoreInfrastructureService; private _maps: MapsInfrastructureService; constructor() { @@ -48,7 +48,7 @@ export class InfrastructureServicesBuilder implements InfrastructureServices{ return this._blobStorage; } - public get datastore(): DatastoreInfrastructureService { + public get datastore(): DatastoreInfrastructureService { return this._datastore; } @@ -88,7 +88,7 @@ export class InfrastructureServicesBuilder implements InfrastructureServices{ return new AzBlobStorageImpl(storageAccount, storageKey); } - private InitDataStore(): DatastoreInfrastructureService { + private InitDataStore(): DatastoreInfrastructureService { return new MongodbDatastoreImpl(); // return { // communityUnitOfWork: MongoCommunityUnitOfWork,