Haciendo un pequeño experimento para reducir el olor del código y en ese esfuerzo estoy tratando de escribir una función escrita que me permita definir mis puntos finales en una ubicación dentro de mi aplicación. La idea es que, si alguna vez cambio o agrego rutas, puedo definirlas en un área que luego se dispersa en la aplicación.
El siguiente ejemplo es donde estoy actualmente. Si bien funciona , todavía es un poco desordenado y no exactamente SECO (repite el valor de enumeración como la path en la función getApiAddress() ).
¿Alguna idea de cómo puedo crear una función que me permita agregar n [] id:string mientras me deshago del {target: '', path: ''} y solo tengo un valor que puede aceptar esos valores de cadena de identificación ?
const apiAddress = process.env === 'PRODUCTION' ? 'https://some-address.com' : 'http://localhost:5000'; export enum targetsEnum { transcribe = '/services/transcribe', transcribeId = '/services/transcribe/:id', } export type ApiTargets = targetsEnum.transcribe | targetsEnum.transcribeId; export const getApiAddress = (target: ApiTargets, id?: string[]): string => { const endpoints = [ { target: targetsEnum.transcribe, path: '/services/transcribe' }, { target: targetsEnum.transcribeId, path: `/services/transcribe/${id[0]}`, }, ]; const matchingEndpoint = endpoints.find( endpoint => endpoint.target === target ); return `${apiAddress}${matchingEndpoint.path}`; };continuó trabajando en esto un poco más.
Con el enfoque a continuación, puede definir sus puntos finales en una ubicación (targetsEnum) y pasar eso a cualquier parte de su aplicación. Luego, el segundo argumento es una matriz de cadenas. Se inyectan en el valor de la enumeración mediante injectPathVariables().
ejemplo:
const endpoint = getApiAddress(ApiEndpointsEnum.youtubeId,['${youtubeId}']);
const apiAddress = process.env === 'PRODUCTION' ? 'https://some-endpoint.com' : 'http://localhost:5000'; export enum testApiEndpointsEnum { test = '/test', testId = '/test/:id', testIdtestId = '/test/:id/test/:id', } export enum ApiEndpointsEnum { youtube = '/services/youtube', youtubeId = '/services/youtube/:id', transcribe = '/services/transcribe', transcribeId = '/services/transcribe/:id', } export type ApiTargets = | testApiEndpointsEnum.test | testApiEndpointsEnum.testId | testApiEndpointsEnum.testIdtestId // * ^ the TWO above this comment are for testing. | ApiEndpointsEnum.youtube | ApiEndpointsEnum.youtubeId | ApiEndpointsEnum.transcribe | ApiEndpointsEnum.transcribeId const injectPathVariables = ( target: ApiTargets[1], ids: string[] ): string => { let newStr = target; ids.forEach(i => { newStr = newStr.replace(':id', i); }); return newStr; }; const getApiAddress = (target: ApiTargets, ids?: string[]): string => { // * no ids provided + confirmation target doesn't need ids. if (ids === undefined && target.includes(':id') === false) { return `${apiAddress}${target}`; } // * no ids provided, but target does need ids. if ( (ids === undefined || ids.length === 0) && target.includes(':id') === true ) { return `${apiAddress}`; } // * ids have been provided. const injectedOutput = injectPathVariables(target, ids); if (injectedOutput.includes(':id')) { // * but not enough ids were provided for complete injection. return apiAddress; } // * sufficient ids have been provided return `${apiAddress}${injectedOutput}`; };