Add Workfeed module with routes, configurations, and API integration handling for employees, shifts, and departments. Update OpenAPI spec and include unit tests for endpoint wiring and filtering logic.

This commit is contained in:
Jeppe Bundgaard
2026-03-24 10:33:17 +01:00
parent ac164a5e81
commit 48a74ad34d
12 changed files with 892 additions and 0 deletions
+246
View File
@@ -7677,6 +7677,193 @@ paths:
schema:
$ref: '#/components/schemas/WeatherApiObjectResponse'
/modules/workfeed/employees:
get:
tags:
- Modules
summary: List Workfeed employees
description: List employees from Workfeed with optional filtering and pagination
operationId: workfeedListEmployees
parameters:
- name: search
in: query
required: false
schema:
type: string
description: Search term for employee lookup
- name: departmentId
in: query
required: false
schema:
type: string
description: Filter by Workfeed department identifier
- name: includeInactive
in: query
required: false
schema:
oneOf:
- type: boolean
- type: string
description: Include inactive employees (`true`/`false`)
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses:
'200':
description: Workfeed employees retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedObjectResponse'
/modules/workfeed/employees/{id}:
get:
tags:
- Modules
summary: Get Workfeed employee
description: Retrieve a single Workfeed employee by identifier
operationId: workfeedGetEmployee
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Workfeed employee identifier
responses:
'200':
description: Workfeed employee retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedObjectResponse'
/modules/workfeed/shifts:
get:
tags:
- Modules
summary: List Workfeed shifts
description: List Workfeed shifts with optional timeframe and pagination filters
operationId: workfeedListShifts
parameters:
- name: from
in: query
required: false
schema:
type: string
description: Shift start range filter (provider-specific date/time format)
- name: to
in: query
required: false
schema:
type: string
description: Shift end range filter (provider-specific date/time format)
- name: departmentId
in: query
required: false
schema:
type: string
description: Filter by Workfeed department identifier
- name: employeeId
in: query
required: false
schema:
type: string
description: Filter by Workfeed employee identifier
- name: status
in: query
required: false
schema:
type: string
description: Filter by shift status
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses:
'200':
description: Workfeed shifts retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedObjectResponse'
/modules/workfeed/shifts/{id}:
get:
tags:
- Modules
summary: Get Workfeed shift
description: Retrieve a single Workfeed shift by identifier
operationId: workfeedGetShift
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Workfeed shift identifier
responses:
'200':
description: Workfeed shift retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedObjectResponse'
/modules/workfeed/departments:
get:
tags:
- Modules
summary: List Workfeed departments
description: List departments from Workfeed with optional filtering and pagination
operationId: workfeedListDepartments
parameters:
- name: search
in: query
required: false
schema:
type: string
description: Search term for department lookup
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses:
'200':
description: Workfeed departments retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedObjectResponse'
/departments/weather:
get:
tags:
@@ -8441,6 +8628,35 @@ paths:
schema:
$ref: '#/components/schemas/ModuleConfigUpdateResponse'
/workfeed/config:
get:
tags: [Config]
summary: Get Workfeed config
operationId: getWorkfeedConfig
responses:
'200':
description: Workfeed configuration retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkfeedConfigListResponse'
post:
tags: [Config]
summary: Update Workfeed config
operationId: updateWorkfeedConfig
requestBody:
required: false
content:
application/json:
schema: {}
responses:
'200':
description: Workfeed configuration updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/ModuleConfigUpdateResponse'
/gatewayapi/config:
get:
tags: [Config]
@@ -9890,6 +10106,18 @@ components:
- type: string
required: [module, variable, type, value]
WorkfeedConfigEntry:
type: object
properties:
module: { type: string, enum: [workfeed] }
variable: { type: string, enum: [enabled, api_url, api_key] }
type: { type: string, enum: [bool, string] }
value:
oneOf:
- type: boolean
- type: string
required: [module, variable, type, value]
GatewayApiConfigEntry:
type: object
properties:
@@ -10084,6 +10312,14 @@ components:
data: { type: array, items: { $ref: '#/components/schemas/WeatherApiConfigEntry' } }
required: [data]
WorkfeedConfigListResponse:
allOf:
- $ref: '#/components/schemas/ModuleConfigEnvelopeBase'
- type: object
properties:
data: { type: array, items: { $ref: '#/components/schemas/WorkfeedConfigEntry' } }
required: [data]
GatewayApiConfigListResponse:
allOf:
- $ref: '#/components/schemas/ModuleConfigEnvelopeBase'
@@ -10203,6 +10439,16 @@ components:
additionalProperties: true
required: [data]
WorkfeedObjectResponse:
allOf:
- $ref: '#/components/schemas/ModuleConfigEnvelopeBase'
- type: object
properties:
data:
type: object
additionalProperties: true
required: [data]
DepartmentWeatherTimelineResponse:
allOf:
- $ref: '#/components/schemas/ModuleConfigEnvelopeBase'