{"version":3,"file":"xxmachina-components-services-command.mjs","sources":["../../../../../packages/@xxmachina/components/src/lib/services/command/command.service.ts","../../../../../packages/@xxmachina/components/src/lib/services/command/xxmachina-components-services-command.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { computed, effect, inject, Injectable, InjectionToken } from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { catchError, interval, lastValueFrom, map, NEVER, ReplaySubject, shareReplay, switchMap } from 'rxjs';\nimport { Command } from '@xxmachina/common/domain/models';\nimport { Resource } from '@xxmachina/common/domain/models';\nimport { JsonSchemaService } from '@xxmachina/components/services/json-schema';\nimport { AppService } from '@ng-atomic/common/services/app';\nimport { distinctUntilChangedArray, injectAll } from '@ng-atomic/common/stores/entities';\nimport { CommandBuilder } from '@xxmachina/common/domain/builder';\nimport { OpenApiService } from '@xxmachina/components/services/openapi';\nimport { CommandActionsBuilder, ActionId, createCommandNavigateAction, CommandActionFactoryOptions, createCommandExecutionAction } from '@xxmachina/common/domain/builder';\nimport { CommandHelper } from '@xxmachina/common/domain/models';\nimport { NavigationExtras } from '@angular/router';\nimport { Action } from '@ng-atomic/core';\nimport { merge } from 'lodash-es';\n\nexport type CommandActionOptions = CommandActionFactoryOptions & { overwrite?: Partial<Action> };\n\nexport type CommandPermissionResolver = (command: Command) => boolean;\nexport const COMMAND_PERMISSION_RESOLVER = new InjectionToken<CommandPermissionResolver>('[@xxmachina/components] COMMAND_PERMISSION_RESOLVER', {\n  providedIn: 'root',\n  factory: () => (command: Command) => true,\n});\n\nexport function provideCommandPermissionResolver(useFactory: () => CommandPermissionResolver) {\n  return { provide: COMMAND_PERMISSION_RESOLVER, useFactory };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CommandService {\n  static readonly ActionId = ActionId;\n  protected readonly app = inject(AppService);\n  protected readonly http = inject(HttpClient);\n  protected readonly resources = injectAll(Resource);\n  protected readonly resourceUrls = computed(() => {\n    return this.resources().filter(resource => resource.type === 'openapi').map((resource) => resource.openapi?.url).filter((u): u is string => !!u);\n  });\n  protected readonly resourceUrls$ = toObservable(this.resourceUrls);\n  protected readonly refresh$ = new ReplaySubject<void>(1);\n  readonly schema = inject(JsonSchemaService);\n  readonly openApi = inject(OpenApiService);\n  readonly commands$ = this.refresh$.pipe(\n    switchMap(() => this.resourceUrls$),\n    this.app.loading.switchMap((urls) => {\n      return this.openApi.getOpenApiMany(urls).pipe(\n        catchError(() => (console.warn('[CommandService] getOpenApiMany failed.'), NEVER)),\n      );\n    }, 'commands-refresh'),\n    map((openApis) => openApis.filter((openApi) => openApi !== null)),\n    map((openApis) => openApis.map((openApi) => new CommandBuilder().buildFromOpenApi(openApi)).flat()),\n    distinctUntilChangedArray(),\n    shareReplay(1),\n  );\n  readonly commands = toSignal<Command[]>(this.commands$, {initialValue: [] as any});\n  protected readonly permissionResolver = inject(COMMAND_PERMISSION_RESOLVER);\n\n  constructor() {\n    this.refresh();\n    interval(1000 * 5).pipe(takeUntilDestroyed()).subscribe(() => this.refresh());\n\n    effect(() => {\n      console.debug('[CommandService] commands:', this.commands());\n    });\n  }\n\n  getCommand(id: string): Command | null {\n    return this.commands()!.find((command) => command.id === id) ?? null;\n  }\n\n  getCommands(ids: string[]): Command[] {\n    return this.commands()!.filter((command) => ids.includes(command.id));\n  }\n\n  getActionBuilder(item?: any): CommandActionsBuilder {\n    return new CommandActionsBuilder().setItem(item).setCommands(this.commands()!);\n  }\n\n  async execute<D extends object>(commandOrCommandId: Command | string, data: D): Promise<any> {\n    const command = this.resolveCommand(commandOrCommandId);\n    if (command === null) throw new Error(`Command not found: ${commandOrCommandId}`);\n    if (command.type === 'webApiRequest') {\n      const endpoint = CommandHelper.resolveEndpoint(command, data as Record<string, any>);\n      switch (command.webApiRequest.responseContentType) {\n        case 'application/octet-stream': {\n          return lastValueFrom(this.http.request(command.webApiRequest.method, endpoint, {\n            responseType: 'blob',\n            observe: 'response',\n            body: data,\n          })).then((res) => {\n            const contentDisposition = res.headers.get('Content-Disposition');\n            const name = contentDisposition?.split('filename=')[1]?.replace(/\"/g, '') ?? 'sample.xlsx';\n            const u = URL.createObjectURL(res.body!);\n            const a = document.createElement('a');\n            a.href = u;\n            a.download = name;\n            a.click();\n          });\n        }\n        default: {\n          console.debug('[CommandService] execute:', {command, data});\n          return lastValueFrom(this.http.request(command.webApiRequest.method, endpoint, { body: data })).then((data) => {\n            return this.resolveResponse(data);\n          });\n        }\n      }\n    }\n  }\n\n  async refresh() {\n    this.refresh$.next();\n  }\n\n  async resolveResponse(data: any) {\n    console.debug('[CommandService] response:', data);\n    if (data?.['__typename'] === 'action') {\n      switch (data['id']) {\n        case 'download': return this.download(data['payload'].url);\n      }\n    }\n    return data;\n  }\n\n  async download(url: string) {\n    return lastValueFrom(this.http.get(url, { responseType: 'blob', observe: 'response' })).then((res) => {\n      const contentDisposition = res.headers.get('Content-Disposition');\n      const name = contentDisposition?.split('filename=')[1]?.replace(/\"/g, '') ?? 'sample.xlsx';\n      const u = URL.createObjectURL(res.body!);\n      const a = document.createElement('a');\n      a.href = u;\n      a.download = name;\n      a.click();\n    });\n  }\n\n  buildNavigationAction(\n    commandOrId: Command | string,\n    data: any = {},\n    navigationExtra: NavigationExtras = {},\n    options: CommandActionOptions = {},\n  ) {\n    const command = this.resolveCommand(commandOrId);\n    const overwrite = merge({disabled: !this.permissionResolver(command!)}, options?.overwrite ?? {});\n    return createCommandNavigateAction(command!, navigationExtra, data, options, overwrite);\n  }\n\n  buildExecutionAction(\n    commandOrId: Command | string,\n    data: any = {},\n    options: CommandActionOptions = {},\n  ) {\n    const command = this.resolveCommand(commandOrId);\n    const overwrite = merge({disabled: !this.hasPermission(command!)}, options?.overwrite ?? {});\n    return createCommandExecutionAction(command!, data, options, overwrite);\n  }\n\n  hasPermission(commandOrId: Command | string): boolean {\n    const command = this.resolveCommand(commandOrId);\n    return this.permissionResolver(command!);\n  }\n\n  protected resolveCommand(commandOrId: Command | string): Command | null {\n    return typeof commandOrId === 'string' ? this.getCommand(commandOrId) : commandOrId;\n  }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}