@sneat/space-services 0.27.14 → 0.27.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -93,7 +93,39 @@ export class SpaceService {
93
93
  createSpace(request) {
94
94
  return this.sneatApiService
95
95
  .post('spaces/create_space', request)
96
- .pipe(map((response) => response.space));
96
+ .pipe(map((response) => {
97
+ const responseContext = response.space;
98
+ const type = response.space.dbo?.type ??
99
+ responseContext.type ??
100
+ responseContext.brief?.type ??
101
+ request.type;
102
+ const title = response.space.dbo?.title ??
103
+ responseContext.brief?.title ??
104
+ request.title;
105
+ const groupKind = type === 'group'
106
+ ? (response.space.dbo?.groupKind ??
107
+ responseContext.brief?.groupKind ??
108
+ request.groupKind)
109
+ : undefined;
110
+ const brief = title
111
+ ? {
112
+ title,
113
+ type,
114
+ ...(groupKind ? { groupKind } : {}),
115
+ ...(responseContext.brief?.parentSpaceID
116
+ ? { parentSpaceID: responseContext.brief.parentSpaceID }
117
+ : {}),
118
+ ...(responseContext.brief?.roles
119
+ ? { roles: responseContext.brief.roles }
120
+ : {}),
121
+ }
122
+ : responseContext.brief;
123
+ return {
124
+ ...response.space,
125
+ type,
126
+ brief,
127
+ };
128
+ }));
97
129
  }
98
130
  // public getSpace(ref: ISpaceRef): Observable<ISpaceContext> {
99
131
  // return this.watchSpace(ref).pipe(first());
@@ -1 +1 @@
1
- {"version":3,"file":"space.service.js","sourceRoot":"","sources":["../../../../../../../libs/space/services/src/lib/services/space.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpParams } from '@angular/common/http';\nimport {\n Injectable,\n Injector,\n inject,\n runInInjectionContext,\n} from '@angular/core';\nimport {\n Firestore as AngularFirestore,\n CollectionReference,\n collection,\n} from 'firebase/firestore';\nimport { SneatApiService, SneatFirestoreService } from '@sneat/api';\nimport {\n AuthStatus,\n AuthStatuses,\n SneatAuthStateService,\n} from '@sneat/auth-core';\nimport { IUserSpaceBrief } from '@sneat/auth-models';\nimport { IIdAndBrief } from '@sneat/core';\nimport { IRecord } from '@sneat/data';\nimport { ISpaceBrief, ISpaceDbo, ISpaceMetric } from '@sneat/dto';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport {\n ICreateSpaceRequest,\n ICreateSpaceResponse,\n ILeaveSpaceRequest,\n ISpaceContext,\n IUpdateRelatedRequest,\n zipMapBriefsWithIDs,\n} from '@sneat/space-models';\nimport { ISneatUserState, SneatUserService } from '@sneat/auth-core';\nimport {\n BehaviorSubject,\n Observable,\n Subject,\n Subscription,\n throwError,\n} from 'rxjs';\nimport { filter, first, map, tap } from 'rxjs/operators';\n\nconst spaceBriefFromUserSpaceInfo = (v: IUserSpaceBrief): ISpaceBrief => ({\n ...v,\n type: v.type,\n});\n\n// export class CachedDataService<Brief, Dbo extends Brief> {\n// \tconstructor(\n// \t\tprivate readonly db: AngularFirestore,\n// \t) {\n// \t}\n//\n// \t// watchRecord()\n// }\n\n@Injectable()\nexport class SpaceService {\n readonly sneatAuthStateService = inject(SneatAuthStateService);\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly afs = inject(AngularFirestore);\n private readonly userService = inject(SneatUserService);\n private readonly sneatApiService = inject(SneatApiService);\n\n private userID?: string;\n\n private currentUserSpaces?: Record<string, IUserSpaceBrief>;\n\n private spaces$: Record<string, BehaviorSubject<ISpaceContext | undefined>> =\n {};\n private subscriptions: Subscription[] = [];\n\n private readonly sfs: SneatFirestoreService<ISpaceBrief, ISpaceDbo>;\n\n private readonly injector = inject(Injector);\n\n constructor() {\n const sneatAuthStateService = this.sneatAuthStateService;\n\n // console.log('SpaceService.constructor()');\n this.sfs = new SneatFirestoreService<ISpaceBrief, ISpaceDbo>(\n this.injector,\n (id: string, dto: ISpaceDbo) => ({\n id,\n ...dto,\n }),\n );\n const onAuthStatusChanged = (status: AuthStatus): void => {\n if (status === 'notAuthenticated') {\n this.unsubscribe('signed out');\n }\n };\n sneatAuthStateService.authStatus.subscribe(onAuthStatusChanged);\n\n // We are intentionally not un-subscribing from user record updates. TODO: why?\n this.userService.userState.subscribe({\n next: this.processUserRecordInSpaceService,\n error: this.errorLogger.logErrorHandler('failed to load user record'),\n });\n }\n\n private readonly processUserRecordInSpaceService = (\n userState: ISneatUserState,\n ): void => {\n const user = userState?.record;\n if (!user) {\n // this.userID = undefined;\n if (\n userState.status === AuthStatuses.notAuthenticated &&\n this.subscriptions?.length\n ) {\n this.unsubscribe(\n 'user is not authenticated and active team subscriptions',\n );\n }\n return;\n }\n if (userState.user?.uid !== this.userID) {\n if (this.userID) {\n this.unsubscribe('user id changed');\n }\n this.userID = userState.user?.uid;\n }\n this.currentUserSpaces = user?.spaces;\n\n zipMapBriefsWithIDs(user.spaces).forEach(this.subscribeForUserSpaceChanges);\n };\n\n public createSpace(\n request: ICreateSpaceRequest,\n ): Observable<IRecord<ISpaceDbo>> {\n return this.sneatApiService\n .post<ICreateSpaceResponse>('spaces/create_space', request)\n .pipe(map((response: ICreateSpaceResponse) => response.space));\n }\n\n // public getSpace(ref: ISpaceRef): Observable<ISpaceContext> {\n // \treturn this.watchSpace(ref).pipe(first());\n // }\n\n public watchSpace(id: string): Observable<ISpaceContext> {\n if (!id) {\n throw new Error('space id is a required parameter');\n }\n if (id === 'contacts') {\n throw new Error('watchSpace({i}d===contacts})');\n }\n let subj = this.spaces$[id];\n if (subj) {\n return subj.asObservable().pipe(filter((s) => !!s));\n }\n let spaceContext: ISpaceContext | undefined = undefined;\n if (this.currentUserSpaces) {\n const userSpaceInfo = this.currentUserSpaces[id];\n if (userSpaceInfo) {\n spaceContext = {\n id,\n type: userSpaceInfo.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceInfo),\n };\n }\n }\n subj = new BehaviorSubject<ISpaceContext | undefined>(spaceContext);\n this.spaces$[id] = subj;\n if (this.userService.currentUserID) {\n this.subscribeForSpaceChanges(id, subj);\n } else {\n this.userService.userState\n .pipe(\n filter((v) => v.status === AuthStatuses.authenticated),\n first(),\n )\n .subscribe({\n next: () => this.subscribeForSpaceChanges(id, subj),\n });\n }\n return subj.asObservable().pipe(filter((s) => !!s));\n }\n\n public onSpaceUpdated(space: ISpaceContext): void {\n let team$ = this.spaces$[space.id];\n if (team$) {\n const prevTeam = team$.value;\n space = { ...prevTeam, ...space };\n } else {\n this.spaces$[space.id] = team$ = new BehaviorSubject<\n ISpaceContext | undefined\n >(space);\n }\n team$.next(space);\n }\n\n public leaveSpace(request: ILeaveSpaceRequest): Observable<void> {\n return this.sneatApiService.post('space/leave_space', request);\n }\n\n public updateRelated(request: IUpdateRelatedRequest): Observable<void> {\n return this.sneatApiService.post('space/update_related', request);\n }\n\n // TODO: move to separate module\n public deleteMetrics(space: string, metrics: string[]): Observable<void> {\n return this.sneatApiService.post('space/remove_metrics', {\n space,\n metrics,\n });\n }\n\n // TODO: move to separate module\n public addMetric(space: string, metric: ISpaceMetric): Observable<void> {\n if (!space) {\n return throwError(() => 'space parameter is required');\n }\n const params = new HttpParams({ fromObject: { id: space } });\n return this.sneatApiService.post('space/add_metric?' + params.toString(), {\n metric,\n });\n }\n\n private readonly subscribeForUserSpaceChanges = (\n userSpaceBrief: IIdAndBrief<IUserSpaceBrief>,\n ): void => {\n let subj = this.spaces$[userSpaceBrief.id];\n if (subj) {\n let space = subj.value;\n if (space && !space?.type) {\n space = {\n ...space,\n type: userSpaceBrief.brief?.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceBrief.brief),\n };\n subj.next(space);\n }\n return;\n }\n\n const space: ISpaceContext = {\n id: userSpaceBrief.id,\n type: userSpaceBrief.brief.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceBrief.brief),\n };\n this.spaces$[space.id] = subj = new BehaviorSubject<\n ISpaceContext | undefined\n >(space);\n this.subscribeForSpaceChanges(space.id, subj);\n };\n\n private subscribeForSpaceChanges(\n id: string,\n subj: Subject<ISpaceContext | undefined>,\n ): void {\n if (id === 'contacts') {\n throw new Error('subscribeForSpaceChanges(id===contacts)');\n }\n const spacesCollection = runInInjectionContext(\n this.injector,\n () => collection(this.afs, 'spaces') as CollectionReference<ISpaceDbo>,\n );\n const o: Observable<ISpaceContext> = this.sfs\n .watchByID(spacesCollection, id)\n .pipe(\n map((team) => {\n // const _prevTeam = this.spaces$[id].value;\n // if (prevTeam.assets) {\n // \tteam = { ...team, assets: prevTeam.assets};\n // \tconsole.log('Reusing assets from prev context');\n // }\n return team;\n }),\n tap(() => {\n // subj.next(team);\n }),\n );\n\n this.subscriptions.push(\n o.subscribe({\n next: (v) => subj.next(v), // Do not use as \"next: subj.next\" because it will be called with wrong \"this\" context\n error: (err) => subj.error(err),\n }),\n );\n }\n\n private unsubscribe(_reason?: string): void {\n try {\n this.subscriptions.forEach((s) => s.unsubscribe());\n this.subscriptions = [];\n this.spaces$ = {};\n } catch (e) {\n this.errorLogger.logError(e, 'SpaceService failed to unsubscribe');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"space.service.js","sourceRoot":"","sources":["../../../../../../../libs/space/services/src/lib/services/space.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,MAAM,EACN,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,IAAI,gBAAgB,EAE7B,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAEL,YAAY,EACZ,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAML,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAmB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,eAAe,EAIf,UAAU,GACX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;;AAEzD,MAAM,2BAA2B,GAAG,CAAC,CAAkB,EAAe,EAAE,CAAC,CAAC;IACxE,GAAG,CAAC;IACJ,IAAI,EAAE,CAAC,CAAC,IAAI;CACb,CAAC,CAAC;AAEH,6DAA6D;AAC7D,gBAAgB;AAChB,2CAA2C;AAC3C,OAAO;AACP,KAAK;AACL,EAAE;AACF,oBAAoB;AACpB,IAAI;AAGJ,MAAM,OAAO,YAAY;IAmBvB;QAlBS,0BAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC9C,gBAAW,GAAG,MAAM,CAAe,WAAW,CAAC,CAAC;QAChD,QAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/B,gBAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACvC,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAMnD,YAAO,GACb,EAAE,CAAC;QACG,kBAAa,GAAmB,EAAE,CAAC;QAI1B,aAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QA2B5B,oCAA+B,GAAG,CACjD,SAA0B,EACpB,EAAE;YACR,MAAM,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,2BAA2B;gBAC3B,IACE,SAAS,CAAC,MAAM,KAAK,YAAY,CAAC,gBAAgB;oBAClD,IAAI,CAAC,aAAa,EAAE,MAAM,EAC1B,CAAC;oBACD,IAAI,CAAC,WAAW,CACd,yDAAyD,CAC1D,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;YACpC,CAAC;YACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,EAAE,MAAM,CAAC;YAEtC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC9E,CAAC,CAAC;QAgIe,iCAA4B,GAAG,CAC9C,cAA4C,EACtC,EAAE;YACR,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBACvB,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;oBAC1B,KAAK,GAAG;wBACN,GAAG,KAAK;wBACR,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,IAAI;wBAChC,KAAK,EAAE,2BAA2B,CAAC,cAAc,CAAC,KAAK,CAAC;qBACzD,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAkB;gBAC3B,EAAE,EAAE,cAAc,CAAC,EAAE;gBACrB,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI;gBAC/B,KAAK,EAAE,2BAA2B,CAAC,cAAc,CAAC,KAAK,CAAC;aACzD,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,eAAe,CAEjD,KAAK,CAAC,CAAC;YACT,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC;QA3MA,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAEzD,6CAA6C;QAC7C,IAAI,CAAC,GAAG,GAAG,IAAI,qBAAqB,CAClC,IAAI,CAAC,QAAQ,EACb,CAAC,EAAU,EAAE,GAAc,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE;YACF,GAAG,GAAG;SACP,CAAC,CACH,CAAC;QACF,MAAM,mBAAmB,GAAG,CAAC,MAAkB,EAAQ,EAAE;YACvD,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBAClC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;QACF,qBAAqB,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAEhE,+EAA+E;QAC/E,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC;YACnC,IAAI,EAAE,IAAI,CAAC,+BAA+B;YAC1C,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,4BAA4B,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IA6BM,WAAW,CAAC,OAA4B;QAC7C,OAAO,IAAI,CAAC,eAAe;aACxB,IAAI,CAAuB,qBAAqB,EAAE,OAAO,CAAC;aAC1D,IAAI,CACH,GAAG,CAAC,CAAC,QAA8B,EAAiB,EAAE;YACpD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAsB,CAAC;YACxD,MAAM,IAAI,GACR,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI;gBACxB,eAAe,CAAC,IAAI;gBACpB,eAAe,CAAC,KAAK,EAAE,IAAI;gBAC3B,OAAO,CAAC,IAAI,CAAC;YACf,MAAM,KAAK,GACT,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK;gBACzB,eAAe,CAAC,KAAK,EAAE,KAAK;gBAC5B,OAAO,CAAC,KAAK,CAAC;YAChB,MAAM,SAAS,GACb,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS;oBAC9B,eAAe,CAAC,KAAK,EAAE,SAAS;oBAChC,OAAO,CAAC,SAAS,CAAC;gBACpB,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,KAAK,GAAG,KAAK;gBACjB,CAAC,CAAC;oBACE,KAAK;oBACL,IAAI;oBACJ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa;wBACtC,CAAC,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,EAAE;wBACxD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK;wBAC9B,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE;wBACxC,CAAC,CAAC,EAAE,CAAC;iBACR;gBACH,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;YAC1B,OAAO;gBACL,GAAG,QAAQ,CAAC,KAAK;gBACjB,IAAI;gBACJ,KAAK;aACN,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACN,CAAC;IAED,+DAA+D;IAC/D,8CAA8C;IAC9C,IAAI;IAEG,UAAU,CAAC,EAAU;QAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,YAAY,GAA8B,SAAS,CAAC;QACxD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,GAAG;oBACb,EAAE;oBACF,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,KAAK,EAAE,2BAA2B,CAAC,aAAa,CAAC;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,GAAG,IAAI,eAAe,CAA4B,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,SAAS;iBACvB,IAAI,CACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,aAAa,CAAC,EACtD,KAAK,EAAE,CACR;iBACA,SAAS,CAAC;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,IAAI,CAAC;aACpD,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,cAAc,CAAC,KAAoB;QACxC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;YAC7B,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,eAAe,CAElD,KAAK,CAAC,CAAC;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAEM,UAAU,CAAC,OAA2B;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,OAA8B;QACjD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,gCAAgC;IACzB,aAAa,CAAC,KAAa,EAAE,OAAiB;QACnD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvD,KAAK;YACL,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IACzB,SAAS,CAAC,KAAa,EAAE,MAAoB;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE;YACxE,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IA8BO,wBAAwB,CAC9B,EAAU,EACV,IAAwC;QAExC,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,IAAI,CAAC,QAAQ,EACb,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAmC,CACvE,CAAC;QACF,MAAM,CAAC,GAA8B,IAAI,CAAC,GAAG;aAC1C,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC;aAC/B,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACX,4CAA4C;YAC5C,yBAAyB;YACzB,+CAA+C;YAC/C,oDAAoD;YACpD,IAAI;YACJ,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EACF,GAAG,CAAC,GAAG,EAAE;YACP,mBAAmB;QACrB,CAAC,CAAC,CACH,CAAC;QAEJ,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,CAAC,CAAC,SAAS,CAAC;YACV,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,sFAAsF;YACjH,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,OAAgB;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;8GA5QU,YAAY;kHAAZ,YAAY;;2FAAZ,YAAY;kBADxB,UAAU","sourcesContent":["import { HttpParams } from '@angular/common/http';\nimport {\n Injectable,\n Injector,\n inject,\n runInInjectionContext,\n} from '@angular/core';\nimport {\n Firestore as AngularFirestore,\n CollectionReference,\n collection,\n} from 'firebase/firestore';\nimport { SneatApiService, SneatFirestoreService } from '@sneat/api';\nimport {\n AuthStatus,\n AuthStatuses,\n SneatAuthStateService,\n} from '@sneat/auth-core';\nimport { IUserSpaceBrief } from '@sneat/auth-models';\nimport { IIdAndBrief } from '@sneat/core';\nimport { ISpaceBrief, ISpaceDbo, ISpaceMetric } from '@sneat/dto';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport {\n ICreateSpaceRequest,\n ICreateSpaceResponse,\n ILeaveSpaceRequest,\n ISpaceContext,\n IUpdateRelatedRequest,\n zipMapBriefsWithIDs,\n} from '@sneat/space-models';\nimport { ISneatUserState, SneatUserService } from '@sneat/auth-core';\nimport {\n BehaviorSubject,\n Observable,\n Subject,\n Subscription,\n throwError,\n} from 'rxjs';\nimport { filter, first, map, tap } from 'rxjs/operators';\n\nconst spaceBriefFromUserSpaceInfo = (v: IUserSpaceBrief): ISpaceBrief => ({\n ...v,\n type: v.type,\n});\n\n// export class CachedDataService<Brief, Dbo extends Brief> {\n// \tconstructor(\n// \t\tprivate readonly db: AngularFirestore,\n// \t) {\n// \t}\n//\n// \t// watchRecord()\n// }\n\n@Injectable()\nexport class SpaceService {\n readonly sneatAuthStateService = inject(SneatAuthStateService);\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly afs = inject(AngularFirestore);\n private readonly userService = inject(SneatUserService);\n private readonly sneatApiService = inject(SneatApiService);\n\n private userID?: string;\n\n private currentUserSpaces?: Record<string, IUserSpaceBrief>;\n\n private spaces$: Record<string, BehaviorSubject<ISpaceContext | undefined>> =\n {};\n private subscriptions: Subscription[] = [];\n\n private readonly sfs: SneatFirestoreService<ISpaceBrief, ISpaceDbo>;\n\n private readonly injector = inject(Injector);\n\n constructor() {\n const sneatAuthStateService = this.sneatAuthStateService;\n\n // console.log('SpaceService.constructor()');\n this.sfs = new SneatFirestoreService<ISpaceBrief, ISpaceDbo>(\n this.injector,\n (id: string, dto: ISpaceDbo) => ({\n id,\n ...dto,\n }),\n );\n const onAuthStatusChanged = (status: AuthStatus): void => {\n if (status === 'notAuthenticated') {\n this.unsubscribe('signed out');\n }\n };\n sneatAuthStateService.authStatus.subscribe(onAuthStatusChanged);\n\n // We are intentionally not un-subscribing from user record updates. TODO: why?\n this.userService.userState.subscribe({\n next: this.processUserRecordInSpaceService,\n error: this.errorLogger.logErrorHandler('failed to load user record'),\n });\n }\n\n private readonly processUserRecordInSpaceService = (\n userState: ISneatUserState,\n ): void => {\n const user = userState?.record;\n if (!user) {\n // this.userID = undefined;\n if (\n userState.status === AuthStatuses.notAuthenticated &&\n this.subscriptions?.length\n ) {\n this.unsubscribe(\n 'user is not authenticated and active team subscriptions',\n );\n }\n return;\n }\n if (userState.user?.uid !== this.userID) {\n if (this.userID) {\n this.unsubscribe('user id changed');\n }\n this.userID = userState.user?.uid;\n }\n this.currentUserSpaces = user?.spaces;\n\n zipMapBriefsWithIDs(user.spaces).forEach(this.subscribeForUserSpaceChanges);\n };\n\n public createSpace(request: ICreateSpaceRequest): Observable<ISpaceContext> {\n return this.sneatApiService\n .post<ICreateSpaceResponse>('spaces/create_space', request)\n .pipe(\n map((response: ICreateSpaceResponse): ISpaceContext => {\n const responseContext = response.space as ISpaceContext;\n const type =\n response.space.dbo?.type ??\n responseContext.type ??\n responseContext.brief?.type ??\n request.type;\n const title =\n response.space.dbo?.title ??\n responseContext.brief?.title ??\n request.title;\n const groupKind =\n type === 'group'\n ? (response.space.dbo?.groupKind ??\n responseContext.brief?.groupKind ??\n request.groupKind)\n : undefined;\n const brief = title\n ? {\n title,\n type,\n ...(groupKind ? { groupKind } : {}),\n ...(responseContext.brief?.parentSpaceID\n ? { parentSpaceID: responseContext.brief.parentSpaceID }\n : {}),\n ...(responseContext.brief?.roles\n ? { roles: responseContext.brief.roles }\n : {}),\n }\n : responseContext.brief;\n return {\n ...response.space,\n type,\n brief,\n };\n }),\n );\n }\n\n // public getSpace(ref: ISpaceRef): Observable<ISpaceContext> {\n // \treturn this.watchSpace(ref).pipe(first());\n // }\n\n public watchSpace(id: string): Observable<ISpaceContext> {\n if (!id) {\n throw new Error('space id is a required parameter');\n }\n if (id === 'contacts') {\n throw new Error('watchSpace({i}d===contacts})');\n }\n let subj = this.spaces$[id];\n if (subj) {\n return subj.asObservable().pipe(filter((s) => !!s));\n }\n let spaceContext: ISpaceContext | undefined = undefined;\n if (this.currentUserSpaces) {\n const userSpaceInfo = this.currentUserSpaces[id];\n if (userSpaceInfo) {\n spaceContext = {\n id,\n type: userSpaceInfo.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceInfo),\n };\n }\n }\n subj = new BehaviorSubject<ISpaceContext | undefined>(spaceContext);\n this.spaces$[id] = subj;\n if (this.userService.currentUserID) {\n this.subscribeForSpaceChanges(id, subj);\n } else {\n this.userService.userState\n .pipe(\n filter((v) => v.status === AuthStatuses.authenticated),\n first(),\n )\n .subscribe({\n next: () => this.subscribeForSpaceChanges(id, subj),\n });\n }\n return subj.asObservable().pipe(filter((s) => !!s));\n }\n\n public onSpaceUpdated(space: ISpaceContext): void {\n let team$ = this.spaces$[space.id];\n if (team$) {\n const prevTeam = team$.value;\n space = { ...prevTeam, ...space };\n } else {\n this.spaces$[space.id] = team$ = new BehaviorSubject<\n ISpaceContext | undefined\n >(space);\n }\n team$.next(space);\n }\n\n public leaveSpace(request: ILeaveSpaceRequest): Observable<void> {\n return this.sneatApiService.post('space/leave_space', request);\n }\n\n public updateRelated(request: IUpdateRelatedRequest): Observable<void> {\n return this.sneatApiService.post('space/update_related', request);\n }\n\n // TODO: move to separate module\n public deleteMetrics(space: string, metrics: string[]): Observable<void> {\n return this.sneatApiService.post('space/remove_metrics', {\n space,\n metrics,\n });\n }\n\n // TODO: move to separate module\n public addMetric(space: string, metric: ISpaceMetric): Observable<void> {\n if (!space) {\n return throwError(() => 'space parameter is required');\n }\n const params = new HttpParams({ fromObject: { id: space } });\n return this.sneatApiService.post('space/add_metric?' + params.toString(), {\n metric,\n });\n }\n\n private readonly subscribeForUserSpaceChanges = (\n userSpaceBrief: IIdAndBrief<IUserSpaceBrief>,\n ): void => {\n let subj = this.spaces$[userSpaceBrief.id];\n if (subj) {\n let space = subj.value;\n if (space && !space?.type) {\n space = {\n ...space,\n type: userSpaceBrief.brief?.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceBrief.brief),\n };\n subj.next(space);\n }\n return;\n }\n\n const space: ISpaceContext = {\n id: userSpaceBrief.id,\n type: userSpaceBrief.brief.type,\n brief: spaceBriefFromUserSpaceInfo(userSpaceBrief.brief),\n };\n this.spaces$[space.id] = subj = new BehaviorSubject<\n ISpaceContext | undefined\n >(space);\n this.subscribeForSpaceChanges(space.id, subj);\n };\n\n private subscribeForSpaceChanges(\n id: string,\n subj: Subject<ISpaceContext | undefined>,\n ): void {\n if (id === 'contacts') {\n throw new Error('subscribeForSpaceChanges(id===contacts)');\n }\n const spacesCollection = runInInjectionContext(\n this.injector,\n () => collection(this.afs, 'spaces') as CollectionReference<ISpaceDbo>,\n );\n const o: Observable<ISpaceContext> = this.sfs\n .watchByID(spacesCollection, id)\n .pipe(\n map((team) => {\n // const _prevTeam = this.spaces$[id].value;\n // if (prevTeam.assets) {\n // \tteam = { ...team, assets: prevTeam.assets};\n // \tconsole.log('Reusing assets from prev context');\n // }\n return team;\n }),\n tap(() => {\n // subj.next(team);\n }),\n );\n\n this.subscriptions.push(\n o.subscribe({\n next: (v) => subj.next(v), // Do not use as \"next: subj.next\" because it will be called with wrong \"this\" context\n error: (err) => subj.error(err),\n }),\n );\n }\n\n private unsubscribe(_reason?: string): void {\n try {\n this.subscriptions.forEach((s) => s.unsubscribe());\n this.subscriptions = [];\n this.spaces$ = {};\n } catch (e) {\n this.errorLogger.logError(e, 'SpaceService failed to unsubscribe');\n }\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import { SneatAuthStateService } from '@sneat/auth-core';
2
- import { IRecord } from '@sneat/data';
3
- import { ISpaceDbo, ISpaceMetric } from '@sneat/dto';
2
+ import { ISpaceMetric } from '@sneat/dto';
4
3
  import { ICreateSpaceRequest, ILeaveSpaceRequest, ISpaceContext, IUpdateRelatedRequest } from '@sneat/space-models';
5
4
  import { Observable } from 'rxjs';
6
5
  import * as i0 from "@angular/core";
@@ -18,7 +17,7 @@ export declare class SpaceService {
18
17
  private readonly injector;
19
18
  constructor();
20
19
  private readonly processUserRecordInSpaceService;
21
- createSpace(request: ICreateSpaceRequest): Observable<IRecord<ISpaceDbo>>;
20
+ createSpace(request: ICreateSpaceRequest): Observable<ISpaceContext>;
22
21
  watchSpace(id: string): Observable<ISpaceContext>;
23
22
  onSpaceUpdated(space: ISpaceContext): void;
24
23
  leaveSpace(request: ILeaveSpaceRequest): Observable<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sneat/space-services",
3
- "version": "0.27.14",
3
+ "version": "0.27.15",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },