Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/clients/IOClients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { CatalogGraphQL } from './apps/catalogGraphQL/index'
import { ID, MasterData, PaymentProvider } from './external'
import { Apps, Assets, BillingMetrics, Events, Registry, Router, VBase, Workspaces } from './infra'
import { IOClient, IOClientConstructor } from './IOClient'
import { LicenseManager, Segment, Session, TenantClient } from './janus'
import { LicenseManager, Segment, Session, TenantClient, Catalog } from './janus'

export type ClientsImplementation<T extends IOClients> = new (
clientOptions: Record<string, InstanceOptions>,
Expand Down Expand Up @@ -93,6 +93,10 @@ export class IOClients {
return this.getOrSet('catalogGraphQL', CatalogGraphQL)
}

public get catalog() {
return this.getOrSet('catalog', Catalog)
}

public get paymentProvider() {
return this.getOrSet('paymentProvider', PaymentProvider)
}
Expand Down
24 changes: 24 additions & 0 deletions src/clients/janus/Catalog/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { inflightUrlWithQuery, RequestConfig } from '../../../HttpClient'
import { JanusClient } from '../JanusClient'
import { SalesChannel } from './types'

const BASE_URL = '/api/catalog_system'

const routes = {
salesChannel: (salesChannelId: number) => `${BASE_URL}/pub/saleschannel/${salesChannelId}`,
}

export class Catalog extends JanusClient {
public getSalesChannel(id: number, config?: RequestConfig) {
const metric = 'catalog-saleschannel'
return this.http.get<SalesChannel>(routes.salesChannel(id), {
inflightKey: inflightUrlWithQuery,
metric,
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}
}
5 changes: 5 additions & 0 deletions src/clients/janus/Catalog/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface SalesChannel {
Id: number
CultureInfo: string
CurrencyCode: string
}
64 changes: 0 additions & 64 deletions src/clients/janus/LicenseManager.ts

This file was deleted.

25 changes: 25 additions & 0 deletions src/clients/janus/LicenseManager/assertBindingInput.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { OptionsCreateBinding } from './types'

const assertBindingInput = ({ addrs, canonicalAddr, supportedLocales, defaultLocale }: OptionsCreateBinding) => {
if (addrs.length === 0) {
throw new Error('A binding must have at least one address')
}

const canonicalAddrExists = addrs.some((addr) => canonicalAddr.host === addr.host && canonicalAddr.path === addr.path)

if (!canonicalAddrExists) {
throw new Error('The canonical address must exist within the address list')
}

if (supportedLocales.length === 0) {
throw new Error('A binding must have at least one locale')
}

const defaultLocaleExists = supportedLocales.some((locale) => defaultLocale === locale)

if (!defaultLocaleExists) {
throw new Error('The default locale must exist within the supported locales')
}
}

export default assertBindingInput
213 changes: 213 additions & 0 deletions src/clients/janus/LicenseManager/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
import { RequestTracingConfig, RequestConfig, inflightUrlWithQuery } from '../../../HttpClient'
import { JanusClient } from '../JanusClient'
import assertBindingInput from './assertBindingInput'
import {
OptionsListBindings,
APIBindingRes,
OptionsGetBinding,
OptionsCreateBinding,
APIBindingCreate,
Addr,
APICreateBindingRes,
OptionsDeleteBinding,
OptionsUpdateBinding,
APIBindingUpdate,
} from './types'

const TWO_MINUTES_S = 2 * 60

const BASE_URL = '/api/license-manager'

const routes = {
accountData: () => `${BASE_URL}/account`,
resourceAccess: (resourceKey: string) => `${BASE_URL}/resources/${encodeURIComponent(resourceKey)}/access`,
topbarData: () => `${BASE_URL}/site/pvt/newtopbar`,
listBindings: (tenant: string) => `${BASE_URL}/binding/site/${encodeURIComponent(tenant)}`,
getBinding: (bindingId: string) => `${BASE_URL}/binding/${encodeURIComponent(bindingId)}`,
createBinding: () => `${BASE_URL}/binding`,
deleteBinding: (bindingId: string) => `${BASE_URL}/binding/${encodeURIComponent(bindingId)}`,
updateBinding: (bindingId: string) => `${BASE_URL}/binding/${encodeURIComponent(bindingId)}`,
}

export class LicenseManager extends JanusClient {
public getAccountData(VtexIdclientAutCookie: string, tracingConfig?: RequestTracingConfig) {
const metric = 'lm-account-data'
return this.http.get(routes.accountData(), {
forceMaxAge: TWO_MINUTES_S,
headers: {
VtexIdclientAutCookie,
},
inflightKey: inflightUrlWithQuery,
metric,
tracing: {
requestSpanNameSuffix: metric,
...tracingConfig?.tracing,
},
})
}

public getTopbarData(VtexIdclientAutCookie: string, tracingConfig?: RequestTracingConfig) {
const metric = 'lm-topbar-data'
return this.http.get(routes.topbarData(), {
headers: {
VtexIdclientAutCookie,
},
metric,
tracing: {
requestSpanNameSuffix: metric,
...tracingConfig?.tracing,
},
})
}

public canAccessResource(VtexIdclientAutCookie: string, resourceKey: string, tracingConfig?: RequestTracingConfig) {
const metric = 'lm-resource-access'
return this.http
.get(routes.resourceAccess(resourceKey), {
headers: {
VtexIdclientAutCookie,
},
metric,
tracing: {
requestSpanNameSuffix: metric,
...tracingConfig?.tracing,
},
})
.then(
() => true,
() => false
)
}

public listBindings = ({ tenant, adminUserAuthToken }: OptionsListBindings, config?: RequestConfig) => {
const metric = 'lm-list-bindings'
return this.http.get<APIBindingRes[]>(routes.listBindings(tenant), {
inflightKey: inflightUrlWithQuery,
memoizeable: true,
metric,
headers: {
VtexIdclientAutCookie: adminUserAuthToken,
},
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}

public getBinding = ({ adminUserAuthToken, bindingId }: OptionsGetBinding, config?: RequestConfig) => {
const metric = 'lm-get-binding'
return this.http.get<APIBindingRes>(routes.getBinding(bindingId), {
inflightKey: inflightUrlWithQuery,
memoizeable: true,
metric,
headers: {
VtexIdclientAutCookie: adminUserAuthToken,
},
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}

public createBinding = (options: OptionsCreateBinding, config?: RequestConfig) => {
assertBindingInput(options)

const metric = 'lm-create-binding'
const { tenant, adminUserAuthToken, defaultLocale, supportedLocales, salesChannelId, addrs, canonicalAddr } =
options

const bindingObj: APIBindingCreate = {
SiteName: tenant,
DefaultLocale: defaultLocale,
SupportedLocales: supportedLocales,
DefaultSalesChannelId: salesChannelId,
Addresses: addrs.map((addr: Addr) => ({
Host: addr.host,
BasePath: addr.path,
IsCanonical: canonicalAddr.host === addr.host && canonicalAddr.path === addr.path,
Localization: {
'': defaultLocale,
},
})),
}

return this.http.post<APICreateBindingRes>(routes.createBinding(), bindingObj, {
inflightKey: inflightUrlWithQuery,
metric,
headers: {
VtexIdclientAutCookie: adminUserAuthToken,
},
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}

public deleteBinding = ({ adminUserAuthToken, bindingId }: OptionsDeleteBinding, config?: RequestConfig) => {
const metric = 'lm-delete-binding'

return this.http.delete(routes.deleteBinding(bindingId), {
inflightKey: inflightUrlWithQuery,
metric,
headers: {
VtexIdclientAutCookie: adminUserAuthToken,
},
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}

public updateBinding = (options: OptionsUpdateBinding, config?: RequestConfig) => {
assertBindingInput(options)

const metric = 'lm-update-binding'
const {
tenant,
adminUserAuthToken,
bindingId,
defaultLocale,
supportedLocales,
salesChannelId,
addrs,
canonicalAddr,
} = options

const bindingObj: APIBindingUpdate = {
Id: bindingId,
SiteName: tenant,
DefaultLocale: defaultLocale,
SupportedLocales: supportedLocales,
DefaultSalesChannelId: salesChannelId,
Addresses: addrs.map((addr: Addr) => ({
Host: addr.host,
BasePath: addr.path,
IsCanonical: canonicalAddr.host === addr.host && canonicalAddr.path === addr.path,
Localization: {
'': defaultLocale,
},
})),
}

return this.http.put(routes.updateBinding(bindingId), bindingObj, {
inflightKey: inflightUrlWithQuery,
metric,
headers: {
VtexIdclientAutCookie: adminUserAuthToken,
},
...config,
tracing: {
requestSpanNameSuffix: metric,
...config?.tracing,
},
})
}
}
Loading
Loading