QUrlService
QUrlService - построение адресов, зависящих от окружения
Создадим необходимое количество API-сервисов. Каждый домен должен быть связан со своим QUrlService:
import { QUrlService } from '@diasoft/qpalette-urls';
 
export class UrlServiceZero extends QUrlService {}
 
export class UrlServiceOne extends QUrlService {}
 
export class UrlServiceTwo extends QUrlService {}
 
export class UrlServiceThree extends QUrlService {}
 
export class UrlServiceFour extends QUrlService {}ВAppModuleукажем провайдеры для всех этих сервисов:
import { QCoreService } from '@diasoft/qpalette-core';
import { QUrlService } from '@diasoft/qpalette-urls';
 
// Можем задать baseUrl прям в коде
const baseUrl = 'https://some-subdomain.$service.$domain/';
 
@NgModule({
  providers: [
    { provide: UrlServiceZero, useFactory: () => new QUrlService() }, // default
    { provide: UrlServiceOne, useFactory: () => new QUrlService( { baseUrl: QCoreService.config.apiBaseUrl }) }, // config from config.json
    { provide: UrlServiceTwo, useFactory: () => new QUrlService({ serviceName: 'service-two' }) },
    { provide: UrlServiceThree, useFactory: () => new QUrlService({ baseUrl }) }, // some url
    { provide: UrlServiceFour, useFactory: () => new QUrlService({ baseUrl, serviceName: 'service-three' }) },
  ],
  ...
})
export class AppModule {
  ...
}И API-сервис:
@Injectable({ providedIn: 'root' })
export class SomeApiService {
  constructor(
    private urlServiceZero: UrlServiceZero,
    private urlServiceOne: UrlServiceOne,
    private urlServiceTwo: UrlServiceTwo,
    private urlServiceThree: UrlServiceThree,
    private urlServiceFour: UrlServiceFour,
  ) {
    const url1 = this.urlServiceZero.url('/foo/bar');
    // /foo/bar
 
    const url2 = this.urlServiceOne.service('service-one', '/foo/bar');
    // /api/service-one/foo/bar
 
    const url3 = this.urlServiceTwo.url('/bar/foo');
    // /service-two/bar/foo
 
    const url4 = this.urlServiceThree.service('service-three', '/bar/foo');
    // https://some-subdomain.service-three.localhost/bar/foo
 
    const url5 = this.urlServiceFour.url('/bar/foo');
    // https://some-subdomain.service-three.localhost/bar/foo
  }
}Об URL паттернах
Это строка с переменными параметрами, зависящими от окружения. Переменные параметры подставляются автоматически в момент выполнения запроса.
Пример паттерна:
$protocol://mdpgateway.$domain[4].$domain[3].$domain[2].$domain[1]Подставляемые переменные:
- $protocol- подставит текущий протокол
- $port- подставит текущий порт
- $domain- подставит текущий домен целиком
- $domain[N]- подставит N уровень домена (например, для mail.google.com,- $domain[1] = com,- $domain[2] = google,- $domain[3] = mail)
- $service- подставит название сервиса из menu.json
- $component- подставит название компонента из menu.json
Пример конфигурации
{
  "tabs": {
    "visible": true,
    "appName": "Q.Palette"
  },
  "sidebar": {
    "visible": true,
    "dynamicMenu": true,
    "logo": "",
    "logoSmall": ""
  },
"feedback": false,
  "loginForm": {
    "visible": true,
    "background": "var(--q-primary-900) center / cover url('assets/images/auth_bg.svg')",
    "logo": "assets/images/digitalq_logo.svg"
  },
  "bundleLoader": {
    "loadingAnimation": "assets/images/loading-bundle.svg",
    "bundleUrl": "/api/$service/$component/main.js"
  },
  "widgetLoader": {
    "bundleUrl": "/api/$service/widgets/$component/main.js"
  },
  "auth": {
    "service": "default",
    "options": {
      "redirectOnLogoutUrl": null,
      "excludeUrlsFromAuthorization": [
        "assets/*"
      ],
      "authDataServiceConfig": {
        "urls": {
          "base": "/api"
        }
      }
    }
  },
  "apiBaseUrl": "/api/$service"
}