feat: create system user accounts

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-07-19 06:55:01 -04:00
parent 681e059870
commit c736e3ebf9
7 changed files with 112 additions and 52 deletions
+36 -23
View File
@@ -131,10 +131,10 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with service object list keyed by provider and service identifier
*/
async function list(targets?: ServiceIdentifier[] | CollectionIdentifier[]): Promise<Record<string, ServiceObject>> {
async function list(targets?: ServiceIdentifier[] | CollectionIdentifier[], user?: string): Promise<Record<string, ServiceObject>> {
transceiving.value = true
try {
const response = await serviceService.list({ targets })
const response = await serviceService.list({ targets }, user)
// Flatten nested structure: provider-id: { service-id: object } -> "provider-id:service-id": object
const services: Record<string, ServiceObject> = {}
@@ -145,8 +145,10 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
})
})
// Merge retrieved services into state
_services.value = { ..._services.value, ...services }
// Merge retrieved services into state (acting-user context stays out of the shared cache)
if (!user) {
_services.value = { ..._services.value, ...services }
}
console.debug('[Mail Manager][Store] - Successfully retrieved', Object.keys(services).length, 'services')
return services
@@ -166,14 +168,16 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with service object
*/
async function fetch(provider: string, identifier: string | number): Promise<ServiceObject> {
async function fetch(provider: string, identifier: string | number, user?: string): Promise<ServiceObject> {
transceiving.value = true
try {
const service = await serviceService.fetch({ provider, identifier })
const service = await serviceService.fetch({ provider, identifier }, user)
// Merge fetched service into state
// Merge fetched service into state (acting-user context stays out of the shared cache)
const key = identifierKey(service.provider, service.identifier)
_services.value[key] = service
if (!user) {
_services.value[key] = service
}
console.debug('[Mail Manager][Store] - Successfully fetched service:', key)
return service
@@ -192,10 +196,10 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with service availability status
*/
async function extant(targets: ServiceIdentifier[]) {
async function extant(targets: ServiceIdentifier[], user?: string) {
transceiving.value = true
try {
const response = await serviceService.extant({ targets })
const response = await serviceService.extant({ targets }, user)
console.debug('[Mail Manager][Store] - Successfully checked', targets?.length ?? 0, 'services')
return response
@@ -215,14 +219,16 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with created service object
*/
async function create(provider: string, data: Partial<ServiceInterface>): Promise<ServiceObject> {
async function create(provider: string, data: Partial<ServiceInterface>, user?: string): Promise<ServiceObject> {
transceiving.value = true
try {
const service = await serviceService.create({ provider, data })
const service = await serviceService.create({ provider, data }, user)
// Merge created service into state
// Merge created service into state (acting-user context stays out of the shared cache)
const key = identifierKey(service.provider, service.identifier)
_services.value[key] = service
if (!user) {
_services.value[key] = service
}
console.debug('[Mail Manager][Store] - Successfully created service:', key)
return service
@@ -244,7 +250,7 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with updated service object
*/
async function update(provider: string, identifier: string | number, delta: boolean, data: ServiceObject | Partial<ServiceInterface>): Promise<ServiceObject> {
async function update(provider: string, identifier: string | number, delta: boolean, data: ServiceObject | Partial<ServiceInterface>, user?: string): Promise<ServiceObject> {
transceiving.value = true
try {
// convert ServiceObject to JSON if needed
@@ -255,11 +261,13 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
payload = data
}
const service = await serviceService.update({ provider, identifier, delta, data: payload })
const service = await serviceService.update({ provider, identifier, delta, data: payload }, user)
// Merge updated service into state
// Merge updated service into state (acting-user context stays out of the shared cache)
const key = identifierKey(service.provider, service.identifier)
_services.value[key] = service
if (!user) {
_services.value[key] = service
}
console.debug('[Mail Manager][Store] - Successfully updated service:', key)
return service
@@ -279,14 +287,16 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
*
* @returns Promise with deletion result
*/
async function remove(provider: string, identifier: string | number): Promise<any> {
async function remove(provider: string, identifier: string | number, user?: string): Promise<any> {
transceiving.value = true
try {
await serviceService.delete({ provider, identifier })
await serviceService.delete({ provider, identifier }, user)
// Remove deleted service from state
const key = identifierKey(provider, identifier)
delete _services.value[key]
if (!user) {
delete _services.value[key]
}
console.debug('[Mail Manager][Store] - Successfully deleted service:', key)
} catch (error: any) {
@@ -314,6 +324,7 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
location: string | undefined,
provider: string | undefined,
onService?: (service: ServiceObject) => void,
user?: string,
): Promise<{ total: number }> {
transceiving.value = true
@@ -322,7 +333,8 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
{ identity, secret, location, provider },
(service: ServiceObject) => {
onService?.(service)
}
},
user
)
console.debug('[Mail Manager][Store] - Successfully discovered', result.total, 'services')
@@ -350,6 +362,7 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
identifier?: string | number | null,
location?: ServiceLocation | Location | null,
identity?: ServiceIdentity | Identity | null,
user?: string,
): Promise<any> {
transceiving.value = true
try {
@@ -372,7 +385,7 @@ export const useServicesStore = defineStore('mailServicesStore', () => {
identity = identity.toJson()
}
const response = await serviceService.test({ provider, identifier, location, identity })
const response = await serviceService.test({ provider, identifier, location, identity }, user)
console.debug('[Mail Manager][Store] - Successfully tested service:', provider, identifier || location)
return response