Skip to main content

DomainService

@webda/core


Class: DomainService<T, E>

Defined in: packages/core/src/services/domainservice.service.ts:315

Domain Service expose all the models as Operations

Model are exposed if they have a Expose decorator

Children models Exposed should be under the first ModelRelated targetting them or the segment endpoint of Expose

Other relations (ModelLinks, ModelParent) should only display their information but not be exposed ModelRelated should be ignored

Webda Modda​

Extends​

Type Parameters​

T​

T extends DomainServiceParameters = DomainServiceParameters

E​

E extends DomainServiceEvents = DomainServiceEvents

Constructors​

Constructor​

new DomainService<T, E>(name, params): DomainService<T, E>

Defined in: packages/core/src/services/service.ts:205

Create a new Service instance

Service

Parameters​

name​

string

The name of the service

params​

T

The parameters block define in the configuration file

Returns​

DomainService<T, E>

Inherited from​

Service.constructor

Properties​

_compiledCapabilities​

protected _compiledCapabilities: Record<string, any> = {}

Defined in: packages/core/src/services/iservice.ts:61

Capabilities detected at compile-time from @WebdaCapability-tagged interfaces.

Populated during Service.resolve by reading the service's entry in webda.module.json. Each key is a capability name (e.g., "request-filter"), and the value is an empty object {} by default. Override getCapabilities to provide capability-specific configuration or to conditionally disable capabilities.

See​

getCapabilities

Inherited from​

Service._compiledCapabilities


[WEBDA_EVENTS]​

[WEBDA_EVENTS]: E

Defined in: packages/core/src/services/service.ts:179

Set the Webda events here

Inherited from​

Service.[WEBDA_EVENTS]


app​

app: Application

Defined in: packages/core/src/services/domainservice.service.ts:322

Application instance


logger​

protected logger: Logger

Defined in: packages/core/src/services/service.ts:192

Logger with class context

Inherited from​

Service.logger


metrics?​

protected optional metrics?: object

Defined in: packages/core/src/services/service.ts:196

Get metrics

Inherited from​

Service.metrics


name​

readonly name: string

Defined in: packages/core/src/services/iservice.ts:35

Name

Inherited from​

Service.name


parameters​

readonly parameters: T

Defined in: packages/core/src/services/iservice.ts:39

Parameters

Inherited from​

Service.parameters


createConfiguration?​

static optional createConfiguration?: (params) => any

Defined in: packages/core/src/services/iservice.ts:44

Create configuration set by the application on load

Parameters​

params​

any

Returns​

any

Inherited from​

Service.createConfiguration


filterConfiguration?​

static optional filterConfiguration?: (params) => any

Defined in: packages/core/src/services/iservice.ts:49

Create configuration set by the application on load

Parameters​

params​

any

Returns​

any

Inherited from​

Service.filterConfiguration


Parameters​

static Parameters: typeof ServiceParameters = ServiceParameters

Defined in: packages/core/src/services/service.ts:175

Service parameters

Inherited from​

Service.Parameters


schemas​

static schemas: object

Defined in: packages/core/src/services/domainservice.service.ts:326

Schemas

searchRequest​

searchRequest: object

searchRequest.properties​

properties: object

searchRequest.properties.count​

count: object

searchRequest.properties.count.type​

type: string = "boolean"

searchRequest.properties.query​

query: object

searchRequest.properties.query.description​

description: string = QUERY_DESCRIPTION

searchRequest.properties.query.type​

type: string = "string"

searchRequest.properties.query.x-webda-sanitize​

x-webda-sanitize: string = "none"

searchRequest.type​

type: string = "object"

uuidRequest​

uuidRequest: object

uuidRequest.properties​

properties: object

uuidRequest.properties.uuid​

uuid: object

uuidRequest.properties.uuid.type​

type: string = "string"

uuidRequest.required​

required: string[]

uuidRequest.type​

type: string = "object"

Methods​

__clean()​

abstract __clean(): Promise<void>

Defined in: packages/core/src/services/service.ts:539

Clean the service data, can only be used in test mode

Returns​

Promise<void>

Inherited from​

Service.__clean


actionInput()​

protected actionInput(modelKey, name): any

Defined in: packages/core/src/services/domainservice.service.ts:650

The .input schema of an action, when it describes its parameters

A module built before x-webda-context expanded an OperationContext parameter into the schema: such an action is treated as taking the context only, as before.

Parameters​

modelKey​

string

model identifier

name​

string

action name

Returns​

any

the input schema, undefined when the action takes no input or has an old-style schema


actionRequestSchema()​

protected actionRequestSchema(modelKey, name, input, pkFields?, requireKey?): string

Defined in: packages/core/src/services/domainservice.service.ts:726

Register the input schema of an instance action operation: the primary key and action parameters

The key fields come first in x-webda-arguments: modelAction loads the object with them and passes the rest to the action method.

Parameters​

modelKey​

string

model identifier

name​

string

action name

input​

any

the action .input schema (its parameters)

pkFields?​

string[] = ...

implicit primary key fields

requireKey?​

boolean = true

whether the caller must supply the parent key (login MFA uses the session)

Returns​

string

the registered schema name, <modelKey>.<name>.request

Throws​

Error when an action parameter conflicts with a primary key field


addBehaviorOperations()​

addBehaviorOperations(model, Metadata, name): void

Defined in: packages/core/src/services/domainservice.service.ts:1013

Register one operation per declared action on every Behavior attribute of the model. Operation ids follow the <Model>.<Attribute>.<Action> shape so transports can discover them with the same lookup logic used for model-level operations.

The actual dispatch is deferred to modelBehaviorAction. This method only wires the registry entries — it does not invoke behaviors.

Parameters​

model​

ModelClass<Model>

the model class owning the behavior attribute

Metadata​

any

the model metadata blob (with Relations.behaviors)

name​

string

the model's short identifier (e.g. "User")

Returns​

void


addListener()​

addListener<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:90

Add listener

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void | Promise<void>

the event listener

Returns​

this

this for chaining

See​

EventEmitter.addListener

Inherited from​

Service.addListener


addRoute()​

protected addRoute(url, methods, executer, openapi?, override?): void

Defined in: packages/core/src/services/service.ts:400

Add a route dynamicaly

Parameters​

url​

string

of the route can contains dynamic part like {uuid}

methods​

HttpMethodType[]

the HTTP methods

executer​

Function

Method to execute for this route

openapi?​

OpenAPIWebdaDefinition = {}

the OpenAPI specification

override?​

boolean = false

whether to override existing

Returns​

void

Inherited from​

Service.addRoute


authorizeClientEvent()​

authorizeClientEvent(_event, _context): boolean

Defined in: packages/core/src/services/service.ts:353

Authorize a public event subscription

Parameters​

_event​

string

the event name

_context​

OperationContext

the execution context

Returns​

boolean

true if the condition is met

Inherited from​

Service.authorizeClientEvent


checkParent()​

protected checkParent(model, parentId, context): Promise<void>

Defined in: packages/core/src/services/domainservice.service.ts:472

checkModelParent, emitting Store.WebNotFound when the parent is missing or unreadable, like any missing object

Parameters​

model​

ModelClass<Model>

the child model class

parentId​

any

the parent primary key

context​

OperationContext

the caller context

Returns​

Promise<void>


checkPermission()​

protected checkPermission(object, context, action, model?): Promise<void>

Defined in: packages/core/src/services/domainservice.service.ts:395

checkModelPermission, emitting Store.WebNotFound when the refusal looks like a missing object, exactly like loadModel does for a missing key

Parameters​

object​

Model

the model instance

context​

OperationContext

the caller context

action​

string

the action

model?​

ModelClass<Model>

the model class (the static canAct asked)

Returns​

Promise<void>


checkReparent()​

protected checkReparent(model, object, input, context): Promise<void>

Defined in: packages/core/src/services/domainservice.service.ts:519

When an update moves an object to another parent, the caller must be able to read the new parent

Parameters​

model​

ModelClass<Model>

the model class

object​

Model

the stored object

input​

any

the sanitized input

context​

OperationContext

the caller context

Returns​

Promise<void>


computeParameters()​

computeParameters(): void

Defined in: packages/core/src/services/service.ts:214

Used to compute or derivate input parameter to attribute

Returns​

void

Deprecated​

Inherited from​

Service.computeParameters


emit()​

emit<Key>(event, data): Promise<void>

Defined in: packages/core/src/services/service.ts:520

Emit the event with data and wait for Promise to finish if listener returned a Promise

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

event​

Key

the event name

data​

E[Key]

the data to process

Returns​

Promise<void>

Inherited from​

Service.emit


getCapabilities()​

getCapabilities(): Record<string, any>

Defined in: packages/core/src/services/iservice.ts:89

Return the capabilities of this service.

By default returns capabilities detected at compile-time from

Returns​

Record<string, any>

the result

Webda Capability-tagged​

interfaces in webda.module.json.

Override to disable capabilities based on configuration:

getCapabilities() {
const caps = super.getCapabilities();
if (!this.parameters.enabled) delete caps["request-filter"];
return caps;
}

Inherited from​

Service.getCapabilities


getClientEvents()​

getClientEvents(): string[]

Defined in: packages/core/src/services/service.ts:341

Return the events that an external system can subscribe to

Returns​

string[]

the list of results

Inherited from​

Service.getClientEvents


getMaxListeners()​

getMaxListeners(): number

Defined in: packages/core/src/events/asynceventemitter.ts:97

Returns​

number

Inherited from​

Service.getMaxListeners


getMetric()​

getMetric<T>(type, configuration): T

Defined in: packages/core/src/services/service.ts:323

Add service name label

Type Parameters​

T​

T = Gauge<string> | Counter<string> | Histogram<string>

Parameters​

type​

CustomConstructor<T, [MetricConfiguration<T>]>

the type to look up

configuration​

MetricConfiguration<T>

the configuration

Returns​

T

the result

Inherited from​

Service.getMetric


getModelInput()​

protected getModelInput(context): Promise<any>

Defined in: packages/core/src/services/domainservice.service.ts:432

The model input of a create, update or patch: always the full request body

The CRUD methods take no argument: resolveArguments spreads the model schema's properties into positional args, so the first one is only the value of the first property, which may itself be an object or an array (#911).

An empty body (undefined) is accepted as "no fields"; any other body that is not a plain object (array, string, number, boolean or null) is refused.

This is the body callOperation validated against the operation input schema and handed to the authorizers: HTML-sanitized, except for the attributes the model tags @sanitize none, html or markdown. Do not override this method to read the raw body (context.getInput({ raw: true })): the model would then receive values that were never validated. Tag the attributes instead.

Parameters​

context​

OperationContext

the operation context

Returns​

Promise<any>

the request body

Throws​

BadRequest when the body is not an object


getName()​

getName(): string

Defined in: packages/core/src/services/service.ts:530

Get service name

Returns​

string

the result string

Inherited from​

Service.getName


getOpenApiReplacements()​

getOpenApiReplacements(): any

Defined in: packages/core/src/services/service.ts:429

Return variables for replacement in openapi

Returns​

any

the result

Inherited from​

Service.getOpenApiReplacements


getOperationId()​

getOperationId(id): string

Defined in: packages/core/src/services/service.ts:387

If undefined is returned it cancel the operation registration

Parameters​

id​

string

the identifier

Returns​

string

the result

Inherited from​

Service.getOperationId


getParameters()​

getParameters(): T

Defined in: packages/core/src/services/service.ts:222

Get the service parameters

Returns​

T

the result

Inherited from​

Service.getParameters


getService()​

getService<T>(name): ServicesMap[T]

Defined in: packages/core/src/services/service.ts:313

Get a service by name

Type Parameters​

T​

T extends keyof ServicesMap

Parameters​

name​

T

the name to use

Returns​

ServicesMap[T]

the result map

Deprecated​

Use useService, might reconsider

Inherited from​

Service.getService


getState()​

getState(): ServiceStates

Defined in: packages/core/src/services/service.ts:185

Get the current state

Returns​

ServiceStates

the result

Inherited from​

Service.getState


getUrl()​

getUrl(url, _methods): string

Defined in: packages/core/src/services/service.ts:364

Return the full path url based on parameters

Parameters​

url​

string

relative url to service

_methods​

HttpMethodType[]

in case we need filtering (like Store)

Returns​

string

absolute url or undefined if need to skip the Route

Inherited from​

Service.getUrl


hasActionInput()​

protected hasActionInput(model, action): boolean

Defined in: packages/core/src/services/domainservice.service.ts:637

Whether an action has an input schema, so it receives its parameters rather than the context

Parameters​

model​

ModelClass<Model>

the model class

action​

the action

name​

string

the action name

Returns​

boolean

true when <model>.<action>.input exists


init()​

abstract init(): Promise<DomainService<T, E>>

Defined in: packages/core/src/services/service.ts:510

Will be called after all the Services are created

Returns​

Promise<DomainService<T, E>>

Inherited from​

Service.init


initMetrics()​

initMetrics(): void

Defined in: packages/core/src/services/service.ts:303

Init the metrics

Returns​

void

Inherited from​

Service.initMetrics


initOperations()​

initOperations(): void

Defined in: packages/core/src/services/domainservice.service.ts:769

Add operations for all exposed models

Returns​

void

the result

Overrides​

Service.initOperations


isExposable()​

isExposable(model, identifier): boolean

Defined in: packages/core/src/services/domainservice.service.ts:761

Whether a model may be exposed: models of INTERNAL_MODELS and their subclasses need an explicit listing in the models parameter

Parameters​

model​

any

model class

identifier​

string

model identifier

Returns​

boolean

true when the model may be exposed


listeners()​

listeners(eventName): Function[]

Defined in: packages/core/src/events/asynceventemitter.ts:195

Get all listeners for an event

Parameters​

eventName​

keyof E

the event name

Returns​

Function[]

the list of results

Inherited from​

Service.listeners


loadCapabilities()​

protected loadCapabilities(): void

Defined in: packages/core/src/services/service.ts:283

Load capabilities from webda.module.json metadata into _compiledCapabilities.

Called during resolve after dependency injection. Reads the service's type name from parameters, looks it up in the application's module metadata (moddas or beans section), and populates _compiledCapabilities with an empty object for each declared capability name.

Fails silently if the application is not available (e.g., in unit tests where services are instantiated without a full application context).

Returns​

void

Example​

// If webda.module.json contains:
// { "moddas": { "MyApp/HawkService": { "capabilities": ["request-filter", "cors-filter"] } } }
// Then after resolve(), this.getCapabilities() returns:
// { "request-filter": {}, "cors-filter": {} }

See​

getCapabilities

Inherited from​

Service.loadCapabilities


log()​

log(level, ...args): void

Defined in: packages/core/src/services/service.ts:561

Log operation

Parameters​

level​

WorkerLogLevel

to log

args​

...any[]

additional arguments

Returns​

void

Inherited from​

Service.log


modelAction()​

modelAction(...args): Promise<any>

Defined in: packages/core/src/services/domainservice.service.ts:674

Action on a model

An instance action receives the primary key fields first (to load the object), then its parameters; a static action its parameters. Actions without an input schema receive the context.

Parameters​

args​

...any[]

arguments forwarded to the action method

Returns​

Promise<any>

the action result


modelBehaviorAction()​

modelBehaviorAction(...args): Promise<any>

Defined in: packages/core/src/services/domainservice.service.ts:1094

Load the parent by its resolved key, check the dotted behavior permission, and forward the typed arguments. Login MFA keeps its own pending-session lifecycle checks.

Parameters​

args​

...any[]

parent key fields followed by method parameters in declaration order

Returns​

Promise<any>

the behavior method's return value


modelCreate()​

modelCreate(): Promise<Model>

Defined in: packages/core/src/services/domainservice.service.ts:446

Create a model operation implementation

The model data is the request body (getModelInput)

Returns​

Promise<Model>

the created model instance


modelDelete()​

modelDelete(uuid): Promise<void>

Defined in: packages/core/src/services/domainservice.service.ts:570

Delete a model operation implementation

Parameters​

uuid​

string

the model primary key

Returns​

Promise<void>


modelGet()​

modelGet(uuid): Promise<Model>

Defined in: packages/core/src/services/domainservice.service.ts:558

Get a model operation implementation

Parameters​

uuid​

string

the model primary key

Returns​

Promise<Model>

the model instance


modelPatch()​

modelPatch(): Promise<Model>

Defined in: packages/core/src/services/domainservice.service.ts:613

Patch a model

The partial update data is the request body (getModelInput)

Returns​

Promise<Model>

the patched model instance


modelQuery()​

modelQuery(query, count?): Promise<any>

Defined in: packages/core/src/services/domainservice.service.ts:588

Query models

With a field list (SELECT title, owner.name WHERE ...) each result only holds the selected fields and the primary key, see queryModelWithPermissions.

Parameters​

query​

string

the query string: a WebdaQL filter, optionally with a SELECT field list

count?​

boolean

also return the total of the query (total), when the model allows it

Returns​

Promise<any>

the query results


modelUpdate()​

modelUpdate(): Promise<Model>

Defined in: packages/core/src/services/domainservice.service.ts:534

Update a model operation implementation

The update data is the request body (getModelInput)

Returns​

Promise<Model>

the updated model instance


off()​

off<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:152

Perform off

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.off

Inherited from​

Service.off


on()​

on<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:128

Perform on

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.once

Inherited from​

Service.on


once()​

once<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:116

Perform once

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.once

Inherited from​

Service.once


operationSchemaName()​

protected operationSchemaName(method, side): string

Defined in: packages/core/src/services/service.ts:441

Schema of an operation side: <service name>.<method>.<side> when the application knows it, else the one the build writes, <class>.<method>.<side>, for the class or its nearest ancestor that has it (a service configured under another name than its class)

Parameters​

method​

string

the method name

side​

"input" | "output"

input or output

Returns​

string

the schema name

Inherited from​

Service.operationSchemaName


removeAllListeners()​

removeAllListeners<Key>(eventName?): this

Defined in: packages/core/src/events/asynceventemitter.ts:162

Remove all listeners

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName?​

Key

the event name

Returns​

this

this for chaining

See​

EventEmitter.removeAllListeners

Inherited from​

Service.removeAllListeners


removeListener()​

removeListener<Key>(eventName, listener): this

Defined in: packages/core/src/events/asynceventemitter.ts:140

Remove listener

Type Parameters​

Key​

Key extends string | number | symbol

Parameters​

eventName​

Key

the event name

listener​

(event) => void

the event listener

Returns​

this

this for chaining

See​

EventEmitter.removeListener

Inherited from​

Service.removeListener


resolve()​

resolve(): this

Defined in: packages/core/src/services/service.ts:249

Resolve parameters and load metadata. @Route-declared routes are scanned and registered by Router.discoverRoutes(services) from Core.init() once every service has resolved — nothing to do per-service here.

Returns​

this

the result

Inherited from​

Service.resolve


resolveUpdateKey()​

protected resolveUpdateKey(input, pkFields, params): any

Defined in: packages/core/src/services/domainservice.service.ts:495

Resolve the primary key of an update or patch: the URL parameters win over the body, and a body carrying another key is refused, so an update can never be redirected to another object

Parameters​

input​

any

the sanitized input, its primary-key fields are removed

pkFields​

string[]

the primary-key fields

params​

Record<string, any>

the URL parameters

Returns​

any

the primary key

Throws​

BadRequest when the body key differs from the URL key


setMaxListeners()​

setMaxListeners(n): this

Defined in: packages/core/src/events/asynceventemitter.ts:104

Parameters​

n​

number

Returns​

this

Inherited from​

Service.setMaxListeners


stop()​

stop(): Promise<void>

Defined in: packages/core/src/services/service.ts:230

Shutdown the current service if action need to be taken

Returns​

Promise<void>

Inherited from​

Service.stop


toJSON()​

toJSON(): string

Defined in: packages/core/src/services/service.ts:499

Prevent service to be serialized

Returns​

string

the result

Inherited from​

Service.toJSON


toString()​

toString(): string

Defined in: packages/core/src/services/service.ts:238

Return service representation

Returns​

string

the result

Inherited from​

Service.toString


transformName()​

transformName(name): string

Defined in: packages/core/src/services/domainservice.service.ts:359

Return the model name for this service

Parameters​

name​

string

the name to use

Returns​

string

the result string

See​

https://blog.boot.dev/clean-code/casings-in-coding/#:~:text=%F0%9F%94%97%20Camel%20Case,Go