From dfe308c0466b9f23f4b90446a514336b9a8320c2 Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Sat, 20 Jun 2026 00:00:28 -0400 Subject: [PATCH] refactor: remove sources selector from frontend Signed-off-by: Sebastian Krupinski --- src/components/EditAccountDialog.vue | 4 ++++ src/services/serviceService.ts | 4 ++-- src/stores/entitiesStore.ts | 4 ++-- src/stores/providersStore.ts | 22 ++++++++++---------- src/stores/servicesStore.ts | 30 ++++++++++++++-------------- src/types/collection.ts | 2 +- src/types/common.ts | 29 ++------------------------- src/types/entity.ts | 2 +- src/types/provider.ts | 8 ++++---- src/types/service.ts | 7 ++++--- 10 files changed, 46 insertions(+), 66 deletions(-) diff --git a/src/components/EditAccountDialog.vue b/src/components/EditAccountDialog.vue index 663d2d9..9951f44 100644 --- a/src/components/EditAccountDialog.vue +++ b/src/components/EditAccountDialog.vue @@ -182,6 +182,10 @@ async function testConnection() { } async function saveAccount() { + if (!localService.value) { + console.error('[Mail Manager][Edit Account Dialog] - No service data to save') + return + } // No changes made, just close the dialog if (!localService.value.mutated() && !localService.value.location?.mutated() && !localService.value.identity?.mutated()) { close() diff --git a/src/services/serviceService.ts b/src/services/serviceService.ts index 65b8d44..bd01de1 100644 --- a/src/services/serviceService.ts +++ b/src/services/serviceService.ts @@ -41,7 +41,7 @@ function createServiceObject(data: ServiceInterface): ServiceObject { export const serviceService = { /** - * Retrieve list of services, optionally filtered by source selector + * Retrieve list of services, optionally filtered by provider/service identifiers * * @param request - list request parameters * @@ -76,7 +76,7 @@ export const serviceService = { }, /** - * Retrieve service availability status for a given source selector + * Retrieve service availability status for the given service identifiers * * @param request - extant request parameters * diff --git a/src/stores/entitiesStore.ts b/src/stores/entitiesStore.ts index 887148f..7462287 100644 --- a/src/stores/entitiesStore.ts +++ b/src/stores/entitiesStore.ts @@ -180,10 +180,10 @@ export const useEntitiesStore = defineStore('mailEntitiesStore', () => { * Note: Delta returns only identifiers, not full entities. * Caller should fetch full entities for additions/modifications separately. */ - async function delta(sources: CollectionIdentifier[]) { + async function delta(targets: CollectionIdentifier[]) { transceiving.value = true try { - const response = await entityService.delta({ sources }) + const response = await entityService.delta({ targets }) // Process delta and update store Object.entries(response).forEach(([, providerData]) => { diff --git a/src/stores/providersStore.ts b/src/stores/providersStore.ts index 8bd6b81..1fd4af6 100644 --- a/src/stores/providersStore.ts +++ b/src/stores/providersStore.ts @@ -6,7 +6,7 @@ import { ref, computed, readonly } from 'vue' import { defineStore } from 'pinia' import { providerService } from '../services' import { ProviderObject } from '../models/provider' -import type { SourceSelector } from '../types' +import type { ProviderIdentifier } from '../types' export const useProvidersStore = defineStore('mailProvidersStore', () => { // State @@ -50,14 +50,14 @@ export const useProvidersStore = defineStore('mailProvidersStore', () => { /** * Retrieve all or specific providers, optionally filtered by source selector * - * @param request - list request parameters + * @param targets - list request parameters * * @returns Promise with provider object list keyed by provider identifier */ - async function list(sources?: SourceSelector): Promise> { + async function list(targets?: ProviderIdentifier[]): Promise> { transceiving.value = true try { - const providers = await providerService.list({ sources }) + const providers = await providerService.list({ targets }) // Merge retrieved providers into state _providers.value = { ..._providers.value, ...providers } @@ -75,14 +75,14 @@ export const useProvidersStore = defineStore('mailProvidersStore', () => { /** * Retrieve a specific provider by identifier * - * @param identifier - provider identifier + * @param target - fetch target identifier * * @returns Promise with provider object */ - async function fetch(identifier: string): Promise { + async function fetch(target: string): Promise { transceiving.value = true try { - const provider = await providerService.fetch({ identifier }) + const provider = await providerService.fetch({ target }) // Merge fetched provider into state _providers.value[provider.identifier] = provider @@ -100,14 +100,14 @@ export const useProvidersStore = defineStore('mailProvidersStore', () => { /** * Retrieve provider availability status for a given source selector * - * @param sources - source selector to check availability for + * @param targets - list of provider identifiers to check availability for * * @returns Promise with provider availability status */ - async function extant(sources: SourceSelector) { + async function extant(targets: ProviderIdentifier[]) { transceiving.value = true try { - const response = await providerService.extant({ sources }) + const response = await providerService.extant({ targets }) Object.entries(response).forEach(([providerId, providerStatus]) => { if (providerStatus === false) { @@ -115,7 +115,7 @@ export const useProvidersStore = defineStore('mailProvidersStore', () => { } }) - console.debug('[Mail Manager][Store] - Successfully checked', sources ? Object.keys(sources).length : 0, 'providers') + console.debug('[Mail Manager][Store] - Successfully checked', targets ? targets.length : 0, 'providers') return response } catch (error: any) { console.error('[Mail Manager][Store] - Failed to check providers:', error) diff --git a/src/stores/servicesStore.ts b/src/stores/servicesStore.ts index e6f5696..a5a28f3 100644 --- a/src/stores/servicesStore.ts +++ b/src/stores/servicesStore.ts @@ -7,9 +7,9 @@ import { defineStore } from 'pinia' import { serviceService } from '../services' import { ServiceObject } from '../models/service' import type { + CollectionIdentifier, ServiceIdentifier, ServiceLocation, - SourceSelector, ServiceIdentity, ServiceInterface, } from '../types' @@ -125,16 +125,16 @@ export const useServicesStore = defineStore('mailServicesStore', () => { // Actions /** - * Retrieve all or specific services, optionally filtered by source selector - * - * @param sources - optional source selector - * + * Retrieve all or specific services, optionally filtered by provider/service identifiers + * + * @param targets - optional array of provider:service (or provider:service:collection) identifiers + * * @returns Promise with service object list keyed by provider and service identifier */ - async function list(sources?: SourceSelector): Promise> { + async function list(targets?: ServiceIdentifier[] | CollectionIdentifier[]): Promise> { transceiving.value = true try { - const response = await serviceService.list({ sources }) + const response = await serviceService.list({ targets }) // Flatten nested structure: provider-id: { service-id: object } -> "provider-id:service-id": object const services: Record = {} @@ -186,18 +186,18 @@ export const useServicesStore = defineStore('mailServicesStore', () => { } /** - * Retrieve service availability status for a given source selector - * - * @param sources - source selector to check availability for - * + * Retrieve service availability status for the given service identifiers + * + * @param targets - array of provider:service identifiers to check availability for + * * @returns Promise with service availability status */ - async function extant(sources: SourceSelector) { + async function extant(targets: ServiceIdentifier[]) { transceiving.value = true try { - const response = await serviceService.extant({ sources }) - - console.debug('[Mail Manager][Store] - Successfully checked', sources ? Object.keys(sources).length : 0, 'services') + const response = await serviceService.extant({ targets }) + + console.debug('[Mail Manager][Store] - Successfully checked', targets?.length ?? 0, 'services') return response } catch (error: any) { console.error('[Mail Manager][Store] - Failed to check services:', error) diff --git a/src/types/collection.ts b/src/types/collection.ts index 15ff465..5b84dbe 100644 --- a/src/types/collection.ts +++ b/src/types/collection.ts @@ -1,7 +1,7 @@ /** * Collection type definitions */ -import type { CollectionIdentifier, ListFilter, ListSort, ServiceIdentifier, SourceSelector } from './common'; +import type { CollectionIdentifier, ListFilter, ListSort, ServiceIdentifier } from './common'; /** * Collection information diff --git a/src/types/common.ts b/src/types/common.ts index ebf8011..1691d7e 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -85,33 +85,8 @@ export type ApiStreamResponse = | ApiStreamDataResponse; /** - * Selector for targeting specific providers, services, collections, or entities in list or extant operations. - * - * Example usage: - * { - * "provider1": true, // Select all services/collections/entities under provider1 - * "provider2": { - * "serviceA": true, // Select all collections/entities under serviceA of provider2 - * "serviceB": { - * "collectionX": true, // Select all entities under collectionX of serviceB of provider2 - * "collectionY": [1, 2, 3] // Select entities with identifiers 1, 2, and 3 under collectionY of serviceB of provider2 - * } - * } - * } - */ -export type SourceSelector = { - [provider: string]: boolean | ServiceSelector; -}; - -export type ServiceSelector = { - [service: string]: boolean | CollectionSelector; -}; - -export type CollectionSelector = { - [collection: string | number]: boolean | EntitySelector; -}; - -export type EntitySelector = (string | number)[]; + * Identifiers for targeting specific providers, services, collections, or entities in list or extant operations. + * export type ProviderIdentifier = `${string}`; export type ServiceIdentifier = `${string}:${string}`; diff --git a/src/types/entity.ts b/src/types/entity.ts index 94f4dfb..f234c94 100644 --- a/src/types/entity.ts +++ b/src/types/entity.ts @@ -92,7 +92,7 @@ export interface EntityExtantResponse { * Entity delta */ export interface EntityDeltaRequest { - sources: CollectionIdentifier[]; + targets: CollectionIdentifier[]; } export interface EntityDeltaResponse { diff --git a/src/types/provider.ts b/src/types/provider.ts index ea00920..60e0b30 100644 --- a/src/types/provider.ts +++ b/src/types/provider.ts @@ -1,7 +1,7 @@ /** * Provider type definitions */ -import type { SourceSelector } from "./common"; +import type { ProviderIdentifier } from "./common"; /** * Provider capabilities @@ -35,7 +35,7 @@ export interface ProviderModelInterface extends Omit