Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<MemoryDataStructure>,
// DomainPropInterface extends EntityProps,
// DomainType extends AggregateRoot<DomainPropInterface>
// > implements TypeConverter<MemoryDataStructure, DomainType,DomainPropInterface,ContextType>
// {
Expand All @@ -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;}
Expand Down
54 changes: 29 additions & 25 deletions src/app/app-context.ts → src/app/app-context-builder.ts
Original file line number Diff line number Diff line change
@@ -1,46 +1,55 @@
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 = {
verifiedJWT: any;
openIdConfigKey: string;
};

export interface AppContext extends BaseApplicationServiceExecutionContext{
export interface AppContext
extends BaseApplicationServiceExecutionContext
{
verifiedUser: VerifiedUser;
communityId: string;
passport: Passport;
applicationServices: ApplicationServices;
infrastructureServices: InfrastructureServices;
applicationServices: ApplicationServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>;
infrastructureServices: InfrastructureServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>;
init(): Promise<void>;
}

export class AppContextImpl implements AppContext {
export class AppContextBuilder<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>
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<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>;
private _infrastructureServices: InfrastructureServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>;

constructor(
verifiedUser: VerifiedUser,
communityHeader: string,
// applicationServices: ApplicationServices,
infrastructureServices: InfrastructureServices
infrastructureServices: InfrastructureServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>
) {
this._verifiedUser = verifiedUser;
this._communityHeader = communityHeader;
// this._applicationServices = applicationServices;
this._applicationServices = new ApplicationServicesBuilder(this);
this._applicationServices = new ApplicationServicesBuilder<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>(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;
}

Expand All @@ -56,20 +65,20 @@ export class AppContextImpl implements AppContext {
return this._passport;
}

get applicationServices(): ApplicationServices {
get applicationServices(): ApplicationServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser> {
return this._applicationServices;
}

get infrastructureServices(): InfrastructureServices {
get infrastructureServices(): InfrastructureServices<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser> {
return this._infrastructureServices;
}

async init(): Promise<void> {
console.log(' initializing app context ...')
await this.setDefaultPassport();
await this.setCommunityData();
await this.setPassport();
await this.initializeDomain();
console.log('AppContext initialized...');
}

private async initializeDomain() {
Expand All @@ -87,24 +96,19 @@ export class AppContextImpl implements AppContext {
}

private async setCommunityData(): Promise<void>{
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<void> {
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();
}
}
134 changes: 134 additions & 0 deletions src/app/application-services/application-services-builder.ts
Original file line number Diff line number Diff line change
@@ -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<TDataCommunity, TDataRole>;
memberBlobStorageApi: MemberBlobStorageAPI<TDataMember>;
propertyBlobStorageApi: PropertyBlobStorageAPI<TDataProperty>;
propertyCognitiveSearchApi: PropertyCognitiveSearchAPI;
serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI;
userDatastoreApi: UserDatastoreAPI<TDataUser>;
roleDatastoreApi: RoleDatastoreAPI<TDataRole>;
serviceDatastoreApi: ServiceDatastoreAPI<TDataService>;
serviceTicketDatastoreApi: ServiceTicketDatastoreAPI<TDataServiceTicket>;
memberDatastoreApi: MemberDatastoreAPI<TDataMember>;
communityDatastoreApi: CommunityDatastoreAPI<TDataCommunity>;
propertyDatastoreApi: PropertyDatastoreAPI<TDataProperty>;
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<TDataCommunity, TDataMember, TDataProperty, TDataRole, TDataService, TDataServiceTicket, TDataUser>
{

communityBlobStorageApi: CommunityBlobStorageAPI<TDataCommunity, TDataRole>;
memberBlobStorageApi: MemberBlobStorageAPI<TDataMember>;
propertyBlobStorageApi: PropertyBlobStorageAPI<TDataProperty>;
propertyCognitiveSearchApi: PropertyCognitiveSearchAPI;
serviceTicketCognitiveSearchApi: ServiceTicketCognitiveSearchAPI;
userDatastoreApi: UserDatastoreAPI<TDataUser>;
roleDatastoreApi: RoleDatastoreAPI<TDataRole>;
serviceDatastoreApi: ServiceDatastoreAPI<TDataService>;
serviceTicketDatastoreApi: ServiceTicketDatastoreAPI<TDataServiceTicket>;
memberDatastoreApi: MemberDatastoreAPI<TDataMember>;
communityDatastoreApi: CommunityDatastoreAPI<TDataCommunity>;
propertyDatastoreApi: PropertyDatastoreAPI<TDataProperty>;
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<TDataCommunity, TDataRole>({ context });
this.memberBlobStorageApi = new MemberBlobApiImpl<TDataMember>({ context });
this.propertyBlobStorageApi = new PropertyBlobApiImpl<TDataProperty>({ context });
this.propertyCognitiveSearchApi = new PropertySearchApiImpl({ context });
this.serviceTicketCognitiveSearchApi = new ServiceTicketSearchApiImpl({ context });
this.userDatastoreApi = new UserDataApiImpl<TDataUser>({ context });
this.roleDatastoreApi = new RoleDataApiImpl<TDataRole>({ context });
this.serviceDatastoreApi = new ServiceDataApiImpl<TDataService>({ context });
this.serviceTicketDatastoreApi = new ServiceTicketDataApiImpl<TDataServiceTicket>({ context });
this.memberDatastoreApi = new MemberDataApiImpl<TDataMember>({ context });
this.communityDatastoreApi = new CommunityDataApiImpl<TDataCommunity>({ context });
this.propertyDatastoreApi = new PropertyDataApiImpl<TDataProperty>({ 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 });
}
}
16 changes: 7 additions & 9 deletions src/app/application-services/blob-storage/community.interface.ts
Original file line number Diff line number Diff line change
@@ -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<TDataCommunity, TDataRole> {
communityPublicFilesList(communityId: string): Promise<FileInfo[]>;
communityPublicFilesListByType(communityId: string, type: string): Promise<FileInfo[]>;
communityPublicFileCreateAuthHeader(communityId: string, fileName: string, contentType: string, contentLength: number): Promise<CommunityBlobContentAuthHeaderResult>;
communityPublicFileCreateAuthHeader(communityId: string, fileName: string, contentType: string, contentLength: number): Promise<CommunityBlobContentAuthHeaderResult<TDataCommunity, TDataRole>>;
communityPublicFileRemove(communityId: string, fileName: string): Promise<void>;
communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise<CommunityBlobContentAuthHeaderResult>;
communityPublicContentCreateAuthHeader(communityId: string, contentType: string, contentLength: number): Promise<CommunityBlobContentAuthHeaderResult<TDataCommunity, TDataRole>>;
}

export type CommunityBlobContentAuthHeaderResult = {
export type CommunityBlobContentAuthHeaderResult<TDataCommunity, TDataRole> = {
authHeader?: BlobAuthHeader;
community?: Community;
community?: Community<TDataCommunity, TDataRole>;
status: MutationStatus;
};



export type Community = CommunityDataStructure & {
export type Community<TDataCommunity, TDataRole> = TDataCommunity & {
domainStatus?: CommunityDomainResult;
files?: FileInfo[];
filesByType?: FileInfo[];
publicContentBlobUrl?: string;
roles?: RoleDataStructure[];
roles?: TDataRole[];
userIsAdmin?: boolean;
};

Expand Down
6 changes: 3 additions & 3 deletions src/app/application-services/blob-storage/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
11 changes: 5 additions & 6 deletions src/app/application-services/blob-storage/member.interface.ts
Original file line number Diff line number Diff line change
@@ -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<TDataMember> {
memberProfileAvatarRemove(memberId: string): Promise<MutationStatus>;
memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise<MemberAvatarImageAuthHeaderResult>;
memberProfileAvatarCreateAuthHeader(memberId: string, fileName: string, contentType: string, contentLength: number): Promise<MemberAvatarImageAuthHeaderResult<TDataMember>>;
}


export type MemberAvatarImageAuthHeaderResult = {
export type MemberAvatarImageAuthHeaderResult<TDataMember> = {
authHeader?: BlobAuthHeader;
member?: Member;
member?: TDataMember;
status: MutationStatus;
};

export type Member = MemberDataStructure
// export type Member = MemberDataStructure
13 changes: 6 additions & 7 deletions src/app/application-services/blob-storage/property.interface.ts
Original file line number Diff line number Diff line change
@@ -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<TDataProperty> {
propertyPublicFileRemove(propertyId: string,memberId: string, fileName: string): Promise<void>;
propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise<PropertyBlobFileAuthHeaderResult>;
propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise<PropertyBlobFileAuthHeaderResult>;
propertyListingImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise<PropertyBlobFileAuthHeaderResult<TDataProperty>>;
propertyFloorPlanImageCreateAuthHeader(propertyId: string, fileName: string, memberId:string, contentType: string, contentLength: number): Promise<PropertyBlobFileAuthHeaderResult<TDataProperty>>;
propertyListingImageRemove(propertyId: string, memberId: string, blobName: string): Promise<MutationStatus>;
}

export type PropertyBlobFileAuthHeaderResult = {
export type PropertyBlobFileAuthHeaderResult<TDataProperty> = {
authHeader?: BlobAuthHeader;
property?: Property;
property?: Property<TDataProperty>;
status: MutationStatus;
};

export type Property = PropertyDataStructure & {
export type Property<TDataProperty> = TDataProperty & {
mapSASToken?: string;
};
Loading