Библиотеки
QUrlService

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"
}