From 1a6cc6b4eb8f1b5a06511f95a551966f7734becc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?= Date: Thu, 20 Mar 2025 21:27:31 -0400 Subject: [PATCH] switch dependency injection to next achievement service --- .../src/services/jslib-services.module.ts | 23 +++--- .../achievement-notifier.service.ts | 4 +- .../achievement.service.abstraction.ts | 26 +++++-- .../default-achievement.service.ts | 76 ------------------- .../achievements/next-achievement.service.ts | 35 +-------- 5 files changed, 35 insertions(+), 129 deletions(-) delete mode 100644 libs/common/src/tools/achievements/default-achievement.service.ts diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index c9747a060df..77a2bdc1ecd 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -247,10 +247,10 @@ import { AuditService } from "@bitwarden/common/services/audit.service"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; import { SearchService } from "@bitwarden/common/services/search.service"; -import { AchievementService as AchievementServiceAbstraction } from "@bitwarden/common/tools/achievements/achievement.service.abstraction"; -import { EventStore } from "@bitwarden/common/tools/achievements/event-store"; -import { EventStoreAbstraction } from "@bitwarden/common/tools/achievements/event-store.abstraction.service"; -import { HubAchievementService } from "@bitwarden/common/tools/achievements/hub-achievement.service"; +import { AchievementService } from "@bitwarden/common/tools/achievements/achievement.service.abstraction"; +import { NextAchievementService } from "@bitwarden/common/tools/achievements/next-achievement.service"; +import { DefaultUserEventCollector } from "@bitwarden/common/tools/log/default-user-event-collector"; +import { UserEventCollector } from "@bitwarden/common/tools/log/user-event-collector"; import { PasswordStrengthService, PasswordStrengthServiceAbstraction, @@ -359,7 +359,6 @@ import { ENV_ADDITIONAL_REGIONS, } from "./injection-tokens"; import { ModalService } from "./modal.service"; -import { AchievementHub } from "@bitwarden/common/tools/achievements/achievement-hub"; /** * Provider definitions used in the ngModule. @@ -1498,21 +1497,21 @@ const safeProviders: SafeProvider[] = [ ], }), safeProvider({ - provide: EventStoreAbstraction, - useClass: EventStore, - deps: [], + provide: UserEventCollector, + useClass: DefaultUserEventCollector, + deps: [AppIdServiceAbstraction, PlatformUtilsServiceAbstraction], }), safeProvider({ - provide: AchievementServiceAbstraction, - useClass: HubAchievementService, - deps: [], + provide: AchievementService, + useClass: NextAchievementService, + deps: [UserEventCollector], }), safeProvider({ provide: AchievementNotifierServiceAbstraction, useClass: AchievementNotifierService, deps: [ AccountServiceAbstraction, - AchievementServiceAbstraction, + AchievementService, PlatformUtilsServiceAbstraction, I18nServiceAbstraction, ToastService, diff --git a/libs/angular/src/tools/achievements/achievement-notifier.service.ts b/libs/angular/src/tools/achievements/achievement-notifier.service.ts index a43198f8815..65485e8b540 100644 --- a/libs/angular/src/tools/achievements/achievement-notifier.service.ts +++ b/libs/angular/src/tools/achievements/achievement-notifier.service.ts @@ -3,7 +3,7 @@ import { concat, filter, map, mergeAll, switchMap } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { NextAchievementService } from "@bitwarden/common/tools/achievements/next-achievement.service"; +import { AchievementService } from "@bitwarden/common/tools/achievements/achievement.service.abstraction"; import { Achievement } from "@bitwarden/common/tools/achievements/types"; import { UserId } from "@bitwarden/common/types/guid"; import { Icon, ToastService } from "@bitwarden/components"; @@ -15,7 +15,7 @@ import { iconMap } from "./icons/iconMap"; export class AchievementNotifierService implements AchievementNotifierServiceAbstraction { constructor( private accountService: AccountService, - private achievementService: NextAchievementService, + private achievementService: AchievementService, private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, private toastService: ToastService, diff --git a/libs/common/src/tools/achievements/achievement.service.abstraction.ts b/libs/common/src/tools/achievements/achievement.service.abstraction.ts index 6e45f633ea2..ab0bf09df32 100644 --- a/libs/common/src/tools/achievements/achievement.service.abstraction.ts +++ b/libs/common/src/tools/achievements/achievement.service.abstraction.ts @@ -1,16 +1,26 @@ import { Observable } from "rxjs"; -import { UserId } from "@bitwarden/common/types/guid"; +import { Account } from "../../auth/abstractions/account.service"; -import { Achievement, AchievementEarnedEvent, AchievementProgressEvent } from "./types"; +import { + Achievement, + AchievementEarnedEvent, + AchievementId, + AchievementProgressEvent, + MetricId, +} from "./types"; export abstract class AchievementService { - abstract achievementById$: (achievementId: string) => Observable; + abstract achievementMap: () => Map; - abstract achievementsEarned$: (userId: UserId) => Observable; - abstract achievementsInProgress$: (userId: UserId) => Observable; + abstract earnedStream$: (account: Account, all?: boolean) => Observable; - abstract earned$: Observable; - abstract inProgress$: Observable; - + abstract earnedMap$: (account: Account) => Observable>; + + abstract progressStream$: ( + account: Account, + all?: boolean, + ) => Observable; + + abstract metricsMap$: (account: Account) => Observable>; } diff --git a/libs/common/src/tools/achievements/default-achievement.service.ts b/libs/common/src/tools/achievements/default-achievement.service.ts deleted file mode 100644 index b1a051478d6..00000000000 --- a/libs/common/src/tools/achievements/default-achievement.service.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { filter, find, from, map, Observable } from "rxjs"; - -import { UserId } from "@bitwarden/common/types/guid"; - -import { AchievementHub } from "./achievement-hub"; -import { AchievementService as AchievementServiceAbstraction } from "./achievement.service.abstraction"; -import { EventStoreAbstraction } from "./event-store.abstraction.service"; -import { - VaultItems_1_Added_Achievement, - VaultItems_10_Added_Achievement, -} from "./examples/achievements"; -import { isEarnedEvent, isProgressEvent } from "./meta"; -import { - Achievement, - AchievementEarnedEvent, - AchievementEvent, - AchievementId, - AchievementProgressEvent, -} from "./types"; - -// Service might be deprecated in favor of the AchievmentHub -// The hub is currently missing a way of listing all achievements, finding by id, but that could be possibly done via the AchievementManager -export class DefaultAchievementService implements AchievementServiceAbstraction { - private _achievements: Achievement[] = [ - VaultItems_1_Added_Achievement, - VaultItems_10_Added_Achievement, - ]; - - private _achievementsSubject = from(this._achievements); - - achievementById$: (achievementId: string) => Observable; - - // Provided by the AchievementHub - achievementsEarned$: (userId: UserId) => Observable; - - // Provided by the AchievementHub - earned$: Observable; - - // Provided by the AchievementHub - achievementsInProgress$: (userId: UserId) => Observable; - - // Provided by the AchievementHub - inProgress$: Observable; - - constructor(protected eventStore: EventStoreAbstraction, protected achievementHub: AchievementHub) { - this.achievementById$ = (achievementId: AchievementId) => - this._achievementsSubject.pipe(find((item: Achievement) => item.name === achievementId)); - - this.achievementsEarned$ = (userId: UserId) => { - return this.eventStore.events$.pipe( - filter( - (event): event is AchievementEarnedEvent => - isEarnedEvent(event as AchievementEvent) && event.user.id === userId, - ), - ); - }; - - this.achievementsInProgress$ = (userId: UserId) => { - return this.eventStore.events$.pipe( - filter( - (event): event is AchievementProgressEvent => - isProgressEvent(event as AchievementEvent) && event.user.id === userId, - ), - ); - }; - - this.earned$ = this.achievementHub.new$().pipe(filter((event) => isEarnedEvent(event)), map((event) => { - return event as AchievementEarnedEvent; - })); - - this.inProgress$ = this.achievementHub.new$().pipe(filter((event) => isProgressEvent(event)), map((event) => { - return event as AchievementProgressEvent; - })); - - } -} diff --git a/libs/common/src/tools/achievements/next-achievement.service.ts b/libs/common/src/tools/achievements/next-achievement.service.ts index ce886729940..007f1ad6306 100644 --- a/libs/common/src/tools/achievements/next-achievement.service.ts +++ b/libs/common/src/tools/achievements/next-achievement.service.ts @@ -1,6 +1,4 @@ -import { BehaviorSubject, EMPTY, filter, find, from, Observable } from "rxjs"; - -import { UserId } from "@bitwarden/common/types/guid"; +import { BehaviorSubject, filter, from } from "rxjs"; import { Account } from "../../auth/abstractions/account.service"; import { UserEventCollector } from "../log/user-event-collector"; @@ -8,20 +6,14 @@ import { UserEventCollector } from "../log/user-event-collector"; import { AchievementHub } from "./achievement-hub"; import { AchievementService as AchievementServiceAbstraction } from "./achievement.service.abstraction"; import { isEarnedEvent, isProgressEvent } from "./meta"; -import { - Achievement, - AchievementEarnedEvent, - AchievementEvent, - AchievementProgressEvent, - AchievementValidator, -} from "./types"; +import { Achievement, AchievementEvent, AchievementValidator } from "./types"; import { ItemCreatedCountConfig } from "./validators/config/item-created-count-config"; import { SendItemCreatedCountConfig } from "./validators/config/send-created-count-config"; import { SendItemCreatedCountValidator } from "./validators/send-item-created-count-validator"; import { VaultItemCreatedCountValidator } from "./validators/vault-item-created-count-validator"; export class NextAchievementService implements AchievementServiceAbstraction { - constructor(private readonly eventLogs: UserEventCollector) {} + constructor(private readonly collector: UserEventCollector) {} private hubs = new Map(); @@ -35,7 +27,7 @@ export class NextAchievementService implements AchievementServiceAbstraction { // FIXME: load stored achievements const achievements$ = from([] as AchievementEvent[]); - const events$ = this.eventLogs.events$(account); + const events$ = this.collector.events$(account); const hub = new AchievementHub(validators$, events$, achievements$); this.hubs.set(account.id, hub); @@ -49,8 +41,6 @@ export class NextAchievementService implements AchievementServiceAbstraction { ...SendItemCreatedCountConfig.AllConfigs, ]; - private _achievementsSubject = from(this._achievements); - achievementMap() { return new Map(this._achievements.map((a) => [a.achievement, a] as const)); } @@ -80,21 +70,4 @@ export class NextAchievementService implements AchievementServiceAbstraction { metricsMap$(account: Account) { return this.getHub(account).metrics$(); } - - achievementById$(achievementId: string): Observable { - return this._achievementsSubject.pipe( - find((item: Achievement) => item.name === achievementId), - filter((f): f is Achievement => !!f), - ); - } - - earned$: Observable = EMPTY; - inProgress$: Observable = EMPTY; - achievementsEarned$(userId: UserId): Observable { - return EMPTY; - } - - achievementsInProgress$(userId: UserId): Observable { - return EMPTY; - } }