diff --git a/data-access/seedwork/services-seedwork-datastore-mongodb/interfaces/base.ts b/data-access/seedwork/services-seedwork-datastore-mongodb/interfaces/base.ts index c4a03caf..1df0878c 100644 --- a/data-access/seedwork/services-seedwork-datastore-mongodb/interfaces/base.ts +++ b/data-access/seedwork/services-seedwork-datastore-mongodb/interfaces/base.ts @@ -43,4 +43,4 @@ export const NestedPathOptions : SchemaOptions = { export const Patterns = { EMAIL_PATTERN: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, GUID_PATTERN: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i, -}; +}; \ No newline at end of file diff --git a/data-access/src/app/application-services/cases/service-ticket/v1/service-ticket.domain.ts b/data-access/src/app/application-services/cases/service-ticket/v1/service-ticket.domain.ts index 335108e4..c8547fb1 100644 --- a/data-access/src/app/application-services/cases/service-ticket/v1/service-ticket.domain.ts +++ b/data-access/src/app/application-services/cases/service-ticket/v1/service-ticket.domain.ts @@ -1,6 +1,5 @@ import { DomainDataSource } from '../../../../data-sources/domain-data-source'; import { Member } from '../../../../domain/contexts/community/member/member'; -import { ReadOnlyDomainVisa } from '../../../../domain/domain.visa'; import { Service } from '../../../../domain/contexts/community/service/service'; import { ServiceTicketV1 } from '../../../../domain/contexts/cases/service-ticket/v1/service-ticket-v1'; import { SentBy, Message, Embedding } from '../../../../domain/contexts/cases/service-ticket/v1/service-ticket-v1-message.value-objects'; @@ -15,6 +14,7 @@ import { ServiceDomainAdapter, ServiceConverter, ServiceTicketV1Converter, + VendorUserConverter, } from '../../../../external-dependencies/domain'; import { ServiceTicketAddUpdateActivityInput, @@ -165,7 +165,14 @@ export class ServiceTicketV1DomainApiImpl extends DomainDataSource { let domainObject = await repo.get(community.id); @@ -54,6 +63,7 @@ export class CommunityDomainApiImpl domainObject.Domain = (community.domain); domainObject.WhiteLabelDomain = (community.whiteLabelDomain); domainObject.Handle = (community.handle); + domainObject.ApprovedVendors = (vendorsList); result = (new CommunityConverter()).toPersistence(await repo.save(domainObject)); }); return result; diff --git a/data-access/src/app/application-services/users/vendor-user/vendor-user.data.ts b/data-access/src/app/application-services/users/vendor-user/vendor-user.data.ts index 410fe89b..a763734b 100644 --- a/data-access/src/app/application-services/users/vendor-user/vendor-user.data.ts +++ b/data-access/src/app/application-services/users/vendor-user/vendor-user.data.ts @@ -7,6 +7,7 @@ export interface VendorUserDataApi { getUserByExternalId(externalId : string): Promise; getUsers(): Promise; } + export class VendorUserDataApiImpl extends CosmosDataSource implements VendorUserDataApi { @@ -22,8 +23,8 @@ export class VendorUserDataApiImpl async getUsers(): Promise { console.log(`getUsers:context${JSON.stringify(this.context.verifiedUser)}`); return this.model - .find({}) - .exec(); + .find() + .exec(); } - + } diff --git a/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket-v1.ts b/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket-v1.ts index 157318e0..77409686 100644 --- a/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket-v1.ts +++ b/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket-v1.ts @@ -19,7 +19,7 @@ import { ServiceTicketV1Message, ServiceTicketV1MessageEntityReference, ServiceT import { ServiceTicketV1RevisionRequest, ServiceTicketV1RevisionRequestEntityReference, ServiceTicketV1RevisionRequestProps } from './service-ticket-v1-revision-request'; import { ServiceTicketV1SyncDomainEventFactory, ServiceTicketV1SyncDomainEventFactoryImpl } from './sync-domain-events/service-ticket-v1.sync-domain-event-factory'; import { ServiceTicketV1SyncDomainEventHandlers } from './sync-domain-events/service-ticket-v1.sync-domain-event-handlers'; - +import { VendorUserEntityReference, VendorUserProps } from '../../../users/vendor-user/vendor-user'; export interface ServiceTicketV1Props extends DomainEntityProps { readonly community: CommunityProps; @@ -32,11 +32,14 @@ export interface ServiceTicketV1Props extends DomainEntityProps { setAssignedToRef(assignedTo: MemberEntityReference): void; readonly service: ServiceProps; setServiceRef(service: ServiceEntityReference): void; + readonly assignedVendor?: VendorUserProps; + setAssignedVendorRef?: (approvedVendors: VendorUserEntityReference) => void; title: string; description: string; readonly ticketType?: string; status: string; priority: number; + readonly activityLog: PropArray; readonly messages: PropArray; readonly revisionRequest?: ServiceTicketV1RevisionRequestProps; @@ -69,6 +72,8 @@ export interface ServiceTicketV1EntityReference | 'messages' | 'photos' | 'revisionRequest' + | 'assignedVendor' + | 'setAssignedVendorRef' > > { readonly community: CommunityEntityReference; @@ -80,6 +85,7 @@ export interface ServiceTicketV1EntityReference readonly messages: ReadonlyArray; readonly photos: ReadonlyArray; readonly revisionRequest: ServiceTicketV1RevisionRequestEntityReference; + readonly assignedVendor?: VendorUserEntityReference; } export interface ServiceTicketV1RootRegistry extends AggregateRootTypeForApplicationService { @@ -106,7 +112,8 @@ export class ServiceTicketV1 extends Aggrega community: CommunityEntityReference, property: PropertyEntityReference, requestor: MemberEntityReference, - context: DomainExecutionContext + context: DomainExecutionContext, + assignedVendor?: VendorUserEntityReference ): ServiceTicketV1 { let serviceTicket = new ServiceTicketV1(newProps, context); serviceTicket.MarkAsNew(); @@ -120,6 +127,9 @@ export class ServiceTicketV1 extends Aggrega serviceTicket.Priority = 5; serviceTicket.syncDomainEventFactory.addServiceTicketV1CreatedEvent({ requestor }); serviceTicket.isNew = false; + if(assignedVendor){ + serviceTicket.AssignedVendor = assignedVendor; + } return serviceTicket; } @@ -188,6 +198,10 @@ export class ServiceTicketV1 extends Aggrega return this.props.revisionRequest ? new ServiceTicketV1RevisionRequest(this.props.revisionRequest, this.context, this.visa) : undefined; } + get assignedVendor() { + return this.props.assignedVendor + } + private readonly validStatusTransitions = new Map([ [ValueObjects.StatusCodes.Draft, [ValueObjects.StatusCodes.Submitted]], [ValueObjects.StatusCodes.Submitted, [ValueObjects.StatusCodes.Draft, ValueObjects.StatusCodes.Assigned]], @@ -226,7 +240,7 @@ export class ServiceTicketV1 extends Aggrega ) { throw new Error('Unauthorized1'); } - this.props.setPropertyRef(property);this.Description + this.props.setPropertyRef(property); } private set Requestor(requestor: MemberEntityReference) { @@ -239,6 +253,13 @@ export class ServiceTicketV1 extends Aggrega this.props.setRequestorRef(requestor); } + set AssignedVendor(assignedVendor: VendorUserEntityReference) { + if (!this.isNew) { + throw new Error('Unauthorized'); + } + this.props.setAssignedVendorRef(assignedVendor); + } + set AssignedTo(assignedTo: MemberEntityReference) { if (!this.isNew && !this.visa.determineIf((permissions) => permissions.isSystemAccount || permissions.canAssignTickets)) { throw new Error('Unauthorized2'); @@ -275,7 +296,6 @@ export class ServiceTicketV1 extends Aggrega } this.props.description = new ValueObjects.Description(description).valueOf(); } - set Status(statusCode: ValueObjects.StatusCode) { if (!this.isNew && !this.visa.determineIf((permissions) => permissions.isSystemAccount)) { diff --git a/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket.value-objects.ts b/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket.value-objects.ts index 33a70dad..c01ae578 100644 --- a/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket.value-objects.ts +++ b/data-access/src/app/domain/contexts/cases/service-ticket/v1/service-ticket.value-objects.ts @@ -1,5 +1,4 @@ -import { VOString, VOSet, VOInteger, VOObject, VOOptional } from '@lucaspaganini/value-objects'; -import { DateTime } from 'graphql-scalars/typings/typeDefs'; +import { VOString, VOSet, VOInteger } from '@lucaspaganini/value-objects'; export const StatusCodes = { Draft: 'DRAFT', @@ -10,7 +9,7 @@ export const StatusCodes = { Closed: 'CLOSED', }; -export class Title extends VOString({ trim: true, maxLength: 200, minLength: 5 }) { } -export class Description extends VOString({ trim: true, maxLength: 2000 }) { } -export class StatusCode extends VOSet(Object.values(StatusCodes)) { } -export class Priority extends VOInteger({ min: 1, max: 5 }) { } \ No newline at end of file +export class Title extends VOString({ trim: true, maxLength: 200, minLength: 5 }) {} +export class Description extends VOString({ trim: true, maxLength: 2000 }) {} +export class StatusCode extends VOSet(Object.values(StatusCodes)) {} +export class Priority extends VOInteger({ min: 1, max: 5 }) {} diff --git a/data-access/src/app/domain/contexts/community/community/community.ts b/data-access/src/app/domain/contexts/community/community/community.ts index 0ea3c30e..d1ebe33b 100644 --- a/data-access/src/app/domain/contexts/community/community/community.ts +++ b/data-access/src/app/domain/contexts/community/community/community.ts @@ -6,6 +6,7 @@ import { DomainExecutionContext, SystemDomainExecutionContext } from '../../../d import { CommunityVisa } from "../community.visa"; import { EndUser, EndUserEntityReference, EndUserProps } from '../../users/end-user/end-user'; import * as ValueObjects from './community.value-objects'; +import { VendorUserEntityReference, VendorUserProps } from '../../users/vendor-user/vendor-user'; export interface CommunityProps extends DomainEntityProps { name: string; @@ -17,10 +18,13 @@ export interface CommunityProps extends DomainEntityProps { readonly schemaVersion: string; readonly createdBy: EndUserProps; setCreatedByRef(user: EndUserEntityReference): void; + readonly approvedVendors?: VendorUserProps[]; + setApprovedVendorsRef?: (approvedVendors: VendorUserEntityReference[]) => void; } -export interface CommunityEntityReference extends Readonly> { +export interface CommunityEntityReference extends Readonly> { readonly createdBy: EndUserEntityReference; + readonly approvedVendors?: VendorUserEntityReference[]; } export class Community extends AggregateRoot implements CommunityEntityReference { @@ -110,6 +114,16 @@ export class Community extends AggregateRoot permissions.canManageCommunitySettings)) { + throw new Error('You do not have permission to change the handle of this community'); + } + if (approvedVendors === null || approvedVendors === undefined) { + throw new Error('approvedVendors cannot be null or undefined'); + } + this.props.setApprovedVendorsRef(approvedVendors); + } + set CreatedBy(createdBy: EndUserEntityReference) { if (!this.isNew && !this.visa.determineIf((permissions) => permissions.canManageCommunitySettings)) { throw new Error('You do not have permission to change the created by of this community'); diff --git a/data-access/src/app/domain/contexts/community/community/community.value-objects.ts b/data-access/src/app/domain/contexts/community/community/community.value-objects.ts index 52916af7..a8486fb9 100644 --- a/data-access/src/app/domain/contexts/community/community/community.value-objects.ts +++ b/data-access/src/app/domain/contexts/community/community/community.value-objects.ts @@ -1,8 +1,6 @@ -import { - VOString -} from '@lucaspaganini/value-objects'; +import { VOString } from '@lucaspaganini/value-objects'; -export class Name extends VOString({trim:true, maxLength:200}) {} -export class Domain extends VOString({trim:true, maxLength:500}) {} -export class WhiteLabelDomain extends VOString({trim:true, maxLength:500}) {} -export class Handle extends VOString({trim:true, maxLength:50}) {} \ No newline at end of file +export class Name extends VOString({ trim: true, maxLength: 200 }) {} +export class Domain extends VOString({ trim: true, maxLength: 500 }) {} +export class WhiteLabelDomain extends VOString({ trim: true, maxLength: 500 }) {} +export class Handle extends VOString({ trim: true, maxLength: 50 }) {} diff --git a/data-access/src/functions/http-graphql/schema/builder/generated.ts b/data-access/src/functions/http-graphql/schema/builder/generated.ts index 24437863..769ce54d 100644 --- a/data-access/src/functions/http-graphql/schema/builder/generated.ts +++ b/data-access/src/functions/http-graphql/schema/builder/generated.ts @@ -237,6 +237,7 @@ export enum CacheControlScope { export type Community = MongoBase & { __typename?: 'Community'; + approvedVendors?: Maybe>>; createdAt?: Maybe; domain?: Maybe; domainStatus?: Maybe; @@ -326,6 +327,7 @@ export type CommunityPublicFileRemoveInput = { }; export type CommunityUpdateInput = { + approvedVendors?: InputMaybe>>; domain?: InputMaybe; handle?: InputMaybe; id: Scalars['ID']; @@ -1465,6 +1467,7 @@ export type ServiceTicket = MongoBase & { __typename?: 'ServiceTicket'; activityLog?: Maybe>>; assignedTo?: Maybe; + assignedVendor?: Maybe; community: Community; createdAt?: Maybe; description: Scalars['String']; @@ -1575,6 +1578,7 @@ export type ServiceTicketSubmitInput = { }; export type ServiceTicketUpdateInput = { + assignedVendor?: InputMaybe; description?: InputMaybe; messages?: InputMaybe>>; priority?: InputMaybe; @@ -2835,6 +2839,7 @@ export interface ByteScalarConfig extends GraphQLScalarTypeConfig = ResolversObject<{ + approvedVendors?: Resolver>>, ParentType, ContextType>; createdAt?: Resolver, ParentType, ContextType>; domain?: Resolver, ParentType, ContextType>; domainStatus?: Resolver, ParentType, ContextType>; @@ -3800,6 +3805,7 @@ export type ServiceTicketResolvers< > = ResolversObject<{ activityLog?: Resolver>>, ParentType, ContextType>; assignedTo?: Resolver, ParentType, ContextType>; + assignedVendor?: Resolver, ParentType, ContextType>; community?: Resolver; createdAt?: Resolver, ParentType, ContextType>; description?: Resolver; diff --git a/data-access/src/functions/http-graphql/schema/builder/graphql.schema.json b/data-access/src/functions/http-graphql/schema/builder/graphql.schema.json index de2f70b4..7e6e56c5 100644 --- a/data-access/src/functions/http-graphql/schema/builder/graphql.schema.json +++ b/data-access/src/functions/http-graphql/schema/builder/graphql.schema.json @@ -1557,6 +1557,22 @@ "name": "Community", "description": null, "fields": [ + { + "name": "approvedVendors", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "VendorUser", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "createdAt", "description": null, @@ -2388,6 +2404,22 @@ "description": null, "fields": null, "inputFields": [ + { + "name": "approvedVendors", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ObjectID", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "domain", "description": null, @@ -11782,6 +11814,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "assignedVendor", + "description": null, + "args": [], + "type": { + "kind": "OBJECT", + "name": "VendorUser", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "community", "description": null, @@ -12862,6 +12906,18 @@ "description": null, "fields": null, "inputFields": [ + { + "name": "assignedVendor", + "description": null, + "type": { + "kind": "SCALAR", + "name": "ObjectID", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "description", "description": null, diff --git a/data-access/src/functions/http-graphql/schema/types/community.graphql b/data-access/src/functions/http-graphql/schema/types/community.graphql index d2214b6e..b73e8c17 100644 --- a/data-access/src/functions/http-graphql/schema/types/community.graphql +++ b/data-access/src/functions/http-graphql/schema/types/community.graphql @@ -13,6 +13,7 @@ type Community implements MongoBase { createdAt: DateTime updatedAt: DateTime userIsAdmin: Boolean + approvedVendors: [VendorUser] } type CommunityDomainResult { @@ -58,6 +59,7 @@ input CommunityUpdateInput { domain: String whiteLabelDomain: String handle: String + approvedVendors: [ObjectID] } input CommunityBlobFileInput { diff --git a/data-access/src/functions/http-graphql/schema/types/community.resolvers.ts b/data-access/src/functions/http-graphql/schema/types/community.resolvers.ts index b988814f..099cadef 100644 --- a/data-access/src/functions/http-graphql/schema/types/community.resolvers.ts +++ b/data-access/src/functions/http-graphql/schema/types/community.resolvers.ts @@ -1,6 +1,7 @@ -import { Resolvers, Community, CommunityMutationResult, Role } from '../builder/generated'; +import { Resolvers, Community, CommunityMutationResult, Role, VendorUser } from '../builder/generated'; import { Community as CommunityDo } from '../../../../infrastructure-services-impl/datastore/mongodb/models/community'; import { applyPermission, applyPermissionFilter, checkAccountPortalAccess, checkAnyAccess, checkStaffPortalAccess, checkSystemAccess } from '../resolver-helper'; +import { isValidObjectId } from 'mongoose'; const CommunityMutationResolver = async (getCommunity: Promise): Promise => { try { @@ -54,6 +55,27 @@ const community: Resolvers = { } return null; }, + approvedVendors: async (rootObj: Community, _args, { applicationServices, passport }) => { + if ( + checkPermission( + passport, + rootObj, + (permissions) => + permissions.canManageAllCommunities || + (permissions.canManageSiteContent && rootObj.approvedVendors?.length) + ) + ) { + return rootObj.approvedVendors.map(async (vendor) => { + if (isValidObjectId(vendor.toString())) { + return (await applicationServices.users.vendorUser.dataApi.getUserById( + vendor.toString() + )) as VendorUser; + } + }); + } + return []; + } + }, Query: { community: async (_, _args, { applicationServices, verifiedUser, passport, member }) => { diff --git a/data-access/src/functions/http-graphql/schema/types/service-ticket.graphql b/data-access/src/functions/http-graphql/schema/types/service-ticket.graphql index 15227709..7d4b7ab9 100644 --- a/data-access/src/functions/http-graphql/schema/types/service-ticket.graphql +++ b/data-access/src/functions/http-graphql/schema/types/service-ticket.graphql @@ -13,7 +13,7 @@ type ServiceTicket implements MongoBase { activityLog: [ServiceTicketActivityDetail] messages: [ServiceTicketV1Message] revisionRequest: ServiceTicketV1RevisionRequest - + assignedVendor: VendorUser id: ObjectID! schemaVersion: String createdAt: DateTime @@ -115,6 +115,7 @@ input ServiceTicketUpdateInput { serviceId: ObjectID messages: [ServiceTicketV1MessageInput] revisionRequest: ServiceTicketV1RevisionRequestUpdateInput + assignedVendor:ObjectID } input ServiceTicketV1MessageInput { diff --git a/data-access/src/functions/http-graphql/schema/types/service-ticket.resolvers.ts b/data-access/src/functions/http-graphql/schema/types/service-ticket.resolvers.ts index 8a6106f4..c2c0c11e 100644 --- a/data-access/src/functions/http-graphql/schema/types/service-ticket.resolvers.ts +++ b/data-access/src/functions/http-graphql/schema/types/service-ticket.resolvers.ts @@ -1,4 +1,4 @@ -import { Community, Member, Property, Resolvers, Service, ServiceTicket, Ticket, ServiceTicketMutationResult } from '../builder/generated'; +import { Community, Member, Property, Resolvers, Service, ServiceTicket, Ticket, ServiceTicketMutationResult, VendorUser } from '../builder/generated'; import { getMemberForCurrentUser } from '../resolver-helper'; import { isValidObjectId } from 'mongoose'; import { ServiceTicket as ServiceTicketDo } from '../../../../infrastructure-services-impl/datastore/mongodb/models/cases/service-ticket'; @@ -50,6 +50,12 @@ const serviceTicket: Resolvers = { } return parent.service; }, + assignedVendor: async (parent, args, context, info) => { + if (parent.assignedVendor && isValidObjectId(parent.assignedVendor.toString())) { + return (await context.applicationServices.users.vendorUser.dataApi.getUserById(parent.assignedVendor.toString())) as VendorUser; + } + return parent.assignedVendor; + }, }, ServiceTicketActivityDetail: { activityBy: async (parent, args, context, info) => { diff --git a/data-access/src/functions/http-graphql/schema/types/vendor-user.graphql b/data-access/src/functions/http-graphql/schema/types/vendor-user.graphql index bfab6d8f..a08d6a2e 100644 --- a/data-access/src/functions/http-graphql/schema/types/vendor-user.graphql +++ b/data-access/src/functions/http-graphql/schema/types/vendor-user.graphql @@ -1,4 +1,3 @@ -# vendor-user.graphql type VendorUser implements MongoBase { externalId: String displayName: String diff --git a/data-access/src/infrastructure-services-impl/datastore/mongodb/infrastructure/cases/service-ticket/v1/service-ticket.domain-adapter.ts b/data-access/src/infrastructure-services-impl/datastore/mongodb/infrastructure/cases/service-ticket/v1/service-ticket.domain-adapter.ts index 23699a58..500e2483 100644 --- a/data-access/src/infrastructure-services-impl/datastore/mongodb/infrastructure/cases/service-ticket/v1/service-ticket.domain-adapter.ts +++ b/data-access/src/infrastructure-services-impl/datastore/mongodb/infrastructure/cases/service-ticket/v1/service-ticket.domain-adapter.ts @@ -30,6 +30,8 @@ import { ServiceTicketV1RevisionRequestedChangesProps } from '../../../../../../ import { ServiceTicketV1Visa } from '../../../../../../../app/domain/contexts/cases/service-ticket/v1/service-ticket.visa'; import { InfrastructureContext } from '../../../../../../../app/init/infrastructure-context'; import { FuncToGetMemberRefFromAuditContextFactory } from '../../../../../../../app/init/audit-context'; +import { VendorUser, VendorUserEntityReference } from '../../../../../../../app/domain/contexts/users/vendor-user/vendor-user'; +import { VendorUserDomainAdapter } from '../../../users/vendor-user/vendor-user.domain-adapter'; export class ServiceTicketV1Converter extends MongoTypeConverter< DomainExecutionContext, @@ -113,6 +115,16 @@ export class ServiceTicketV1DomainAdapter extends MongooseDomainAdapter new VendorUserDomainAdapter(item, this.infrastructureContext)); + } + setApprovedVendorsRef(approvedVendors: VendorUserEntityReference[]) { + this.doc.set('approvedVendors', approvedVendors.map((item)=> item.id)); + } + + get createdBy(): EndUserProps { if (this.doc.createdBy) { return new EndUserDomainAdapter(this.doc.createdBy, this.infrastructureContext); diff --git a/data-access/src/infrastructure-services-impl/datastore/mongodb/models/cases/service-ticket.ts b/data-access/src/infrastructure-services-impl/datastore/mongodb/models/cases/service-ticket.ts index 8d9d7284..a6406228 100644 --- a/data-access/src/infrastructure-services-impl/datastore/mongodb/models/cases/service-ticket.ts +++ b/data-access/src/infrastructure-services-impl/datastore/mongodb/models/cases/service-ticket.ts @@ -5,6 +5,7 @@ import * as Property from './../property'; import * as Member from './../member'; import * as Service from './../service'; import { Ticket, TicketModel, ticketOptions } from './ticket'; +import * as VendorUser from '../users/vendor-user'; export interface ServiceTicketRevisionRequestChanges extends NestedPath { requestUpdatedAssignment: boolean; @@ -114,6 +115,7 @@ export interface ServiceTicket extends Ticket { hash: string; lastIndexed: Date; updateIndexFailedDate: Date; + assignedVendor: PopulatedDoc; } const ServiceTicketSchema = new Schema, ServiceTicket>( @@ -159,8 +161,9 @@ const ServiceTicketSchema = new Schema, Serv hash: { type: String, required: false, maxlength: 100 }, lastIndexed: { type: Date, required: false }, updateIndexFailedDate: { type: Date, required: false }, + assignedVendor: { type: Schema.Types.ObjectId, ref: VendorUser.VendorUserModel.modelName, required: true } }, - ticketOptions + ticketOptions, ); // TODO: Discriminator key and Version can't exist together, if we don't use version key it will fall back to __v diff --git a/data-access/src/infrastructure-services-impl/datastore/mongodb/models/community.ts b/data-access/src/infrastructure-services-impl/datastore/mongodb/models/community.ts index 707d837e..14b61b3d 100644 --- a/data-access/src/infrastructure-services-impl/datastore/mongodb/models/community.ts +++ b/data-access/src/infrastructure-services-impl/datastore/mongodb/models/community.ts @@ -1,12 +1,13 @@ import { Schema, model, Model, ObjectId, PopulatedDoc } from 'mongoose'; import { Base } from '../../../../../seedwork/services-seedwork-datastore-mongodb/interfaces/base'; import * as EndUser from './users/end-user'; - +import { VendorUser, VendorUserModel } from './users/vendor-user'; export interface Community extends Base { name: string; domain: string; whiteLabelDomain: string; handle: string; + approvedVendors?: PopulatedDoc[] | ObjectId[]; createdBy:PopulatedDoc | ObjectId; } @@ -25,6 +26,7 @@ export const CommunityModel = model('Community',new Schema>>; createdAt?: Maybe; domain?: Maybe; domainStatus?: Maybe; @@ -324,6 +325,7 @@ export type CommunityPublicFileRemoveInput = { }; export type CommunityUpdateInput = { + approvedVendors?: InputMaybe>>; domain?: InputMaybe; handle?: InputMaybe; id: Scalars['ID']; @@ -1463,6 +1465,7 @@ export type ServiceTicket = MongoBase & { __typename?: 'ServiceTicket'; activityLog?: Maybe>>; assignedTo?: Maybe; + assignedVendor?: Maybe; community: Community; createdAt?: Maybe; description: Scalars['String']; @@ -1573,6 +1576,7 @@ export type ServiceTicketSubmitInput = { }; export type ServiceTicketUpdateInput = { + assignedVendor?: InputMaybe; description?: InputMaybe; messages?: InputMaybe>>; priority?: InputMaybe;