import type { Params, ServiceInterface } from '@feathersjs/feathers' import type { Application } from '../../declarations' import wildDuckClient from '../../clients/wildduck.client' import { faker } from '@faker-js/faker' import { BadRequest } from '@feathersjs/errors' interface Alias { success: boolean, id: string, address: string, main: boolean, user: string, tags: string[], created: string, } interface GetAddressInfoResponse { success: boolean, results: Alias[] } interface CreateAddressResponse { success: boolean, id: string, } type AliasesData = any type AliasesPatch = any type AliasesQuery = any export type { Alias as Aliases, AliasesData, AliasesPatch, AliasesQuery } export interface AliasesServiceOptions { app: Application } export interface AliasesParams extends Params { session?: any } export class AliasesService implements ServiceInterface { constructor(public options: AliasesServiceOptions) { } async find(params: ServiceParams): Promise { const userId = await this.getUserIdByEmailAddress(params) const { data: userAddressesResponse } = await wildDuckClient.get(`/users/${userId}/addresses`) return userAddressesResponse.results } async create(data: AliasesData, params: ServiceParams): Promise async create(data: AliasesData, params: ServiceParams): Promise { const userId = await this.getUserIdByEmailAddress(params) const alias = `${faker.animal.crocodilia().replace(/\s/, '').slice(10)}-${faker.git.commitSha({ length: 5 })}`; const createResult = await wildDuckClient.post(`/users/${userId}/addresses`, { address: alias }) if (!createResult.data.success) { throw new BadRequest('Failed to create alias') } const { data: userAddressesResponse } = await wildDuckClient.get(`/users/${userId}/addresses`) return userAddressesResponse.results } private async getUserIdByEmailAddress(params: ServiceParams): Promise { const emails = params.session?.user?.emails; const addressInfoResponse = await Promise.any(emails.map((email: string) => wildDuckClient.get(`addresses/resolve/${email}`))) return addressInfoResponse.data.user } } export const getOptions = (app: Application) => { return { app } }