Skip to main content

Apps Domain

The Apps domain provides endpoints for managing a client's applications. An app is a client-scoped record that links a client to a Catalog App and adds client-specific metadata such as favorite status and license tracking.

The underlying apps table is an overlay on the shared catalog_applications table. Catalog data (name, logo, vendor, categories) comes from the catalog; client-specific data (is_favorite, license_count) lives on the app record itself.

For embedding and endpoint design decisions, see the Design Guidelines.

Endpoints

EndpointMethodDescription
List AppsGETPaginated list of the client's apps
Get AppGETFetch a single app by ID
Update AppPATCHUpdate client-specific fields (favorite, approved, license count)
Add FavoritesPOSTBulk add apps to favorites
Remove FavoritesPOSTBulk remove apps from favorites
Approve AppsPOSTBulk approve apps
Reject AppsPOSTBulk reject apps

Why catalog_app is embedded

The catalog app is the identity of an app -- you need its name, logo, vendor, and categories to display anything meaningful. It passes all three conditions of the embedding rule:

RelationshipBounded?Always needed?Static?Decision
App → CatalogAppYes (always 1)YesYesEmbed
CatalogApp → VendorYes (always 1)YesYesEmbed (inside catalog_app)
CatalogApp → CategoriesYes (1–5)YesYesEmbed (inside catalog_app)

The embedded catalog_app reuses the existing CatalogApp DTO. This avoids defining a near-identical Ref type and keeps the shape consistent across domains.

Data Transfer Objects (DTOs)

AppRef

Lightweight app reference for embedding inside analytics and cross-domain responses. Contains only the fields needed to identify and display an app in a table row or list item. Consumers call Get App for the full object.

The rule for what belongs in AppRef: ask "does every place this app appears as a non-primary resource need this field to render a meaningful row?" If yes, it belongs here. If only the app's own endpoints need it (e.g. vendor, categories, license count), it belongs in App only.

{
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"canonical_name": "Slack",
"logo": "https://cdn.example.com/logos/slack.png",
"type": "desktop",
"is_favorite": true,
"is_approved": true
}
FieldTypeNullableDescription
idstring (uuid)NoStable unique identifier for this client-app record
canonical_namestringNoDisplay name from the catalog
logostringYesLogo URL from the catalog. null if no logo is available.
typestringNoCatalog app type (e.g. desktop, browser)
is_favoritebooleanNoWhether this app is marked as a favorite for the client
is_approvedbooleanNoWhether this app is approved for use by the client

DB source:

DTO FieldDB Column
idapps.id
canonical_namecatalog_applications.canonical_name (via apps.catalog_application_id)
logocatalog_applications.logo
typecatalog_applications.type
is_favoriteapps.is_favorite
is_approvedapps.is_approved

Used in: App Utilization (analytics domain)


App

Full client-app object returned by list and detail endpoints. Wraps the CatalogApp DTO with client-specific fields.

{
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"catalog_app": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"canonical_name": "Slack",
"description": "A messaging and collaboration platform for teams",
"display_colour": "#4A154B",
"logo": "https://cdn.example.com/logos/slack.png",
"type": "desktop",
"vendor": {
"id": "f6a7b8c9-d0e1-2345-fabc-678901234567",
"name": "Salesforce, Inc.",
"url": "https://www.salesforce.com"
},
"categories": [
{ "id": "a7b8c9d0-e1f2-3456-abcd-789012345678", "name": "Communication" }
],
"created_at": "2025-06-15T10:00:00.000Z",
"updated_at": "2026-02-10T09:15:00.000Z"
},
"is_favorite": true,
"is_approved": true,
"license_count": 25,
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-02-20T14:30:00.000Z"
}
FieldTypeNullableDescription
idstring (uuid)NoStable unique identifier for this client-app record
catalog_appCatalogAppNoThe catalog application this record is linked to, with vendor and categories embedded
is_favoritebooleanNoWhether this app is marked as a favorite for the client
is_approvedbooleanNoWhether this app is approved for use by the client
license_countintegerYesNumber of tracked licenses. null if not tracked.
created_atstring (ISO 8601)NoWhen this app record was first created
updated_atstring (ISO 8601)NoWhen this app record was last modified

DB source:

DTO FieldDB Column
idapps.id
catalog_appJoined via apps.catalog_application_id → full CatalogApp DTO
is_favoriteapps.is_favorite
is_approvedapps.is_approved
license_countapps.license_count
created_atapps.created_at
updated_atapps.updated_at

Omitted internal fields: client_id (in URL path), partner_id, created_by, updated_by, catalog_application_id (replaced by embedded catalog_app)

Used in: List Apps, Get App, Update App (response)


Embedded DTOs from other domains

The App DTO embeds the following DTOs defined elsewhere:

  • CatalogApp — Full catalog app with vendor and categories embedded
  • CatalogVendor — Vendor identity (inside catalog_app.vendor)
  • CatalogCategory — Category identity (inside catalog_app.categories)