@proxima-nexus/openapi 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,42 @@ All notable changes to the Proxima Nexus OpenAPI specification are documented in
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.2.0] - 2026-03-02
9
+
10
+ ### Added
11
+
12
+ - **Event time range filters**
13
+ - `GET /event`: optional `from` / `to` query params to filter events by time window (`from` = events ending after this instant, `to` = events starting before this instant).
14
+ - `GET /user/{userId}/events`: optional `from` / `to` range filters with the same semantics; `from` defaults to “now” when omitted.
15
+ - `GET /group/{groupId}/events`: optional `from` / `to` range filters with the same semantics.
16
+ - `GET /events/search`: optional `from` / `to` range filters with the same semantics.
17
+ - `GET /event-series/{seriesId}/events`: optional `from` / `to` range filters with the same semantics.
18
+
19
+ ### Changed
20
+
21
+ - **Event series instances**: `GET /event-series/{seriesId}/events` summary/description now clarify that the endpoint returns instances ordered by start time and **defaults to only ongoing/upcoming instances** unless a custom `from` / `to` window is provided.
22
+
23
+ ## [2.1.0] - 2026-03-02
24
+
25
+ ### Added
26
+
27
+ - **Event series API**
28
+ - `POST /event-series`: create an event series from an RRULE and pre-generate all event instances. The creating user (or associated group) becomes the OWNER.
29
+ - `GET /event-series/{seriesId}`: fetch an event series definition.
30
+ - `PUT /event-series/{seriesId}`: update a series and propagate metadata changes to upcoming instances (per-instance overrides are preserved).
31
+ - `DELETE /event-series/{seriesId}`: delete a series and all upcoming event instances; past instances are preserved.
32
+ - `GET /event-series/{seriesId}/events`: list all event instances in a series, ordered by start time.
33
+ - **New schemas**: `CreateEventSeriesDto`, `EventSeriesDto`, and `UpdateEventSeriesDto` for creating, returning, and updating event series.
34
+ - **Event instances**: `EventDto` now includes an optional `seriesId` linking an instance back to its series.
35
+
36
+ ### Changed
37
+
38
+ - **Event updates**: `PUT /event/{eventId}` summary clarifies how updates behave for instances in a series—fields supplied in the request body are treated as per-instance overrides and no longer follow series-level updates.
39
+ - **Validation**
40
+ - `UpdateUserDto`: `displayName` is no longer required; only `gender` and `birthDate` remain required.
41
+ - `CreateEventDto`: schema no longer requires `displayName`, `startTime`, `endTime`, or `type` (server-side validation may still enforce business rules).
42
+ - Group create/update DTOs that previously required `displayName` now only require `type`.
43
+
8
44
  ## [2.0.1] - 2026-02-04
9
45
 
10
46
  ### Changed
package/openapi.json CHANGED
@@ -132,6 +132,26 @@
132
132
  "type": "number"
133
133
  }
134
134
  },
135
+ {
136
+ "name": "from",
137
+ "required": false,
138
+ "in": "query",
139
+ "description": "ISO 8601 date — filter events ending after this time",
140
+ "schema": {
141
+ "example": "2025-01-01T00:00:00Z",
142
+ "type": "string"
143
+ }
144
+ },
145
+ {
146
+ "name": "to",
147
+ "required": false,
148
+ "in": "query",
149
+ "description": "ISO 8601 date — filter events starting before this time",
150
+ "schema": {
151
+ "example": "2025-12-31T23:59:59Z",
152
+ "type": "string"
153
+ }
154
+ },
135
155
  {
136
156
  "name": "X-Proxima-Nexus-Requester-User-Id",
137
157
  "in": "header",
@@ -618,6 +638,24 @@
618
638
  "type": "string"
619
639
  }
620
640
  },
641
+ {
642
+ "name": "from",
643
+ "required": false,
644
+ "in": "query",
645
+ "description": "ISO 8601 start of range (events ending after this time). Default: NOW()",
646
+ "schema": {
647
+ "type": "string"
648
+ }
649
+ },
650
+ {
651
+ "name": "to",
652
+ "required": false,
653
+ "in": "query",
654
+ "description": "ISO 8601 end of range (events starting before this time)",
655
+ "schema": {
656
+ "type": "string"
657
+ }
658
+ },
621
659
  {
622
660
  "name": "X-Proxima-Nexus-Requester-User-Id",
623
661
  "in": "header",
@@ -799,6 +837,26 @@
799
837
  "type": "number"
800
838
  }
801
839
  },
840
+ {
841
+ "name": "from",
842
+ "required": false,
843
+ "in": "query",
844
+ "description": "ISO 8601 date — filter events ending after this time",
845
+ "schema": {
846
+ "example": "2025-01-01T00:00:00Z",
847
+ "type": "string"
848
+ }
849
+ },
850
+ {
851
+ "name": "to",
852
+ "required": false,
853
+ "in": "query",
854
+ "description": "ISO 8601 date — filter events starting before this time",
855
+ "schema": {
856
+ "example": "2025-12-31T23:59:59Z",
857
+ "type": "string"
858
+ }
859
+ },
802
860
  {
803
861
  "name": "X-Proxima-Nexus-Requester-User-Id",
804
862
  "in": "header",
@@ -880,7 +938,7 @@
880
938
  },
881
939
  "put": {
882
940
  "operationId": "EventController_update",
883
- "summary": "Update an event",
941
+ "summary": "Update an event. For series instances, only the fields provided in the request body will be marked as overridden and will no longer be propagated by series-level updates.",
884
942
  "parameters": [
885
943
  {
886
944
  "name": "eventId",
@@ -1341,6 +1399,26 @@
1341
1399
  "type": "number"
1342
1400
  }
1343
1401
  },
1402
+ {
1403
+ "name": "from",
1404
+ "required": false,
1405
+ "in": "query",
1406
+ "description": "ISO 8601 date — filter events ending after this time",
1407
+ "schema": {
1408
+ "example": "2025-01-01T00:00:00Z",
1409
+ "type": "string"
1410
+ }
1411
+ },
1412
+ {
1413
+ "name": "to",
1414
+ "required": false,
1415
+ "in": "query",
1416
+ "description": "ISO 8601 date — filter events starting before this time",
1417
+ "schema": {
1418
+ "example": "2025-12-31T23:59:59Z",
1419
+ "type": "string"
1420
+ }
1421
+ },
1344
1422
  {
1345
1423
  "name": "X-Proxima-Nexus-Requester-User-Id",
1346
1424
  "in": "header",
@@ -1736,6 +1814,24 @@
1736
1814
  "type": "string"
1737
1815
  }
1738
1816
  },
1817
+ {
1818
+ "name": "from",
1819
+ "required": false,
1820
+ "in": "query",
1821
+ "description": "ISO 8601 start of range (events ending after this time). Default: NOW()",
1822
+ "schema": {
1823
+ "type": "string"
1824
+ }
1825
+ },
1826
+ {
1827
+ "name": "to",
1828
+ "required": false,
1829
+ "in": "query",
1830
+ "description": "ISO 8601 end of range (events starting before this time)",
1831
+ "schema": {
1832
+ "type": "string"
1833
+ }
1834
+ },
1739
1835
  {
1740
1836
  "name": "X-Proxima-Nexus-Requester-User-Id",
1741
1837
  "in": "header",
@@ -1820,6 +1916,263 @@
1820
1916
  }
1821
1917
  ]
1822
1918
  }
1919
+ },
1920
+ "/event-series": {
1921
+ "post": {
1922
+ "operationId": "EventSeriesController_create",
1923
+ "summary": "Create an event series",
1924
+ "description": "Creates a series definition and pre-generates all event instances based on the RRULE. The creating user (or associated group) becomes the OWNER.",
1925
+ "parameters": [
1926
+ {
1927
+ "name": "X-Proxima-Nexus-Requester-User-Id",
1928
+ "in": "header",
1929
+ "description": "ID of the user creating the series",
1930
+ "required": true,
1931
+ "schema": {
1932
+ "type": "string"
1933
+ }
1934
+ }
1935
+ ],
1936
+ "requestBody": {
1937
+ "required": true,
1938
+ "content": {
1939
+ "application/json": {
1940
+ "schema": {
1941
+ "$ref": "#/components/schemas/CreateEventSeriesDto"
1942
+ }
1943
+ }
1944
+ }
1945
+ },
1946
+ "responses": {
1947
+ "201": {
1948
+ "description": "Created series ID",
1949
+ "content": {
1950
+ "application/json": {
1951
+ "schema": {
1952
+ "type": "string"
1953
+ }
1954
+ }
1955
+ }
1956
+ },
1957
+ "400": {
1958
+ "description": "Requester user ID missing, or associated group not found"
1959
+ },
1960
+ "401": {
1961
+ "description": "User cannot create series for the associated group"
1962
+ }
1963
+ },
1964
+ "tags": [
1965
+ "event-series"
1966
+ ],
1967
+ "security": [
1968
+ {
1969
+ "api_key": []
1970
+ }
1971
+ ]
1972
+ }
1973
+ },
1974
+ "/event-series/{seriesId}": {
1975
+ "get": {
1976
+ "operationId": "EventSeriesController_get",
1977
+ "summary": "Get an event series by ID",
1978
+ "parameters": [
1979
+ {
1980
+ "name": "seriesId",
1981
+ "required": true,
1982
+ "in": "path",
1983
+ "schema": {
1984
+ "type": "string"
1985
+ }
1986
+ }
1987
+ ],
1988
+ "responses": {
1989
+ "200": {
1990
+ "description": "Event series returned",
1991
+ "content": {
1992
+ "application/json": {
1993
+ "schema": {
1994
+ "$ref": "#/components/schemas/EventSeriesDto"
1995
+ }
1996
+ }
1997
+ }
1998
+ },
1999
+ "404": {
2000
+ "description": "Series not found"
2001
+ }
2002
+ },
2003
+ "tags": [
2004
+ "event-series"
2005
+ ],
2006
+ "security": [
2007
+ {
2008
+ "api_key": []
2009
+ }
2010
+ ]
2011
+ },
2012
+ "put": {
2013
+ "operationId": "EventSeriesController_update",
2014
+ "summary": "Update an event series",
2015
+ "description": "Updates the series definition and propagates metadata changes to all upcoming event instances. Fields that were individually overridden on a specific instance will not be overwritten.",
2016
+ "parameters": [
2017
+ {
2018
+ "name": "seriesId",
2019
+ "required": true,
2020
+ "in": "path",
2021
+ "schema": {
2022
+ "type": "string"
2023
+ }
2024
+ },
2025
+ {
2026
+ "name": "X-Proxima-Nexus-Requester-User-Id",
2027
+ "in": "header",
2028
+ "description": "ID of the user updating the series",
2029
+ "required": true,
2030
+ "schema": {
2031
+ "type": "string"
2032
+ }
2033
+ }
2034
+ ],
2035
+ "requestBody": {
2036
+ "required": true,
2037
+ "content": {
2038
+ "application/json": {
2039
+ "schema": {
2040
+ "$ref": "#/components/schemas/UpdateEventSeriesDto"
2041
+ }
2042
+ }
2043
+ }
2044
+ },
2045
+ "responses": {
2046
+ "200": {
2047
+ "description": "Updated series ID",
2048
+ "content": {
2049
+ "application/json": {
2050
+ "schema": {
2051
+ "type": "string"
2052
+ }
2053
+ }
2054
+ }
2055
+ },
2056
+ "401": {
2057
+ "description": "User cannot edit this series"
2058
+ },
2059
+ "404": {
2060
+ "description": "Series not found"
2061
+ }
2062
+ },
2063
+ "tags": [
2064
+ "event-series"
2065
+ ],
2066
+ "security": [
2067
+ {
2068
+ "api_key": []
2069
+ }
2070
+ ]
2071
+ },
2072
+ "delete": {
2073
+ "operationId": "EventSeriesController_remove",
2074
+ "summary": "Delete an event series",
2075
+ "description": "Deletes the series and all upcoming event instances. Past instances (already started) are preserved.",
2076
+ "parameters": [
2077
+ {
2078
+ "name": "seriesId",
2079
+ "required": true,
2080
+ "in": "path",
2081
+ "schema": {
2082
+ "type": "string"
2083
+ }
2084
+ },
2085
+ {
2086
+ "name": "X-Proxima-Nexus-Requester-User-Id",
2087
+ "in": "header",
2088
+ "description": "ID of the user deleting the series",
2089
+ "required": true,
2090
+ "schema": {
2091
+ "type": "string"
2092
+ }
2093
+ }
2094
+ ],
2095
+ "responses": {
2096
+ "204": {
2097
+ "description": "Series deleted"
2098
+ },
2099
+ "401": {
2100
+ "description": "User cannot delete this series"
2101
+ },
2102
+ "404": {
2103
+ "description": "Series not found"
2104
+ }
2105
+ },
2106
+ "tags": [
2107
+ "event-series"
2108
+ ],
2109
+ "security": [
2110
+ {
2111
+ "api_key": []
2112
+ }
2113
+ ]
2114
+ }
2115
+ },
2116
+ "/event-series/{seriesId}/events": {
2117
+ "get": {
2118
+ "operationId": "EventSeriesController_getInstances",
2119
+ "summary": "List event instances in a series",
2120
+ "description": "Returns event instances belonging to this series, ordered by start time. Defaults to only ongoing/upcoming instances.",
2121
+ "parameters": [
2122
+ {
2123
+ "name": "seriesId",
2124
+ "required": true,
2125
+ "in": "path",
2126
+ "schema": {
2127
+ "type": "string"
2128
+ }
2129
+ },
2130
+ {
2131
+ "name": "from",
2132
+ "required": false,
2133
+ "in": "query",
2134
+ "description": "ISO 8601 start of range (events ending after this time). Default: NOW()",
2135
+ "schema": {
2136
+ "type": "string"
2137
+ }
2138
+ },
2139
+ {
2140
+ "name": "to",
2141
+ "required": false,
2142
+ "in": "query",
2143
+ "description": "ISO 8601 end of range (events starting before this time)",
2144
+ "schema": {
2145
+ "type": "string"
2146
+ }
2147
+ }
2148
+ ],
2149
+ "responses": {
2150
+ "200": {
2151
+ "description": "Event instances returned",
2152
+ "content": {
2153
+ "application/json": {
2154
+ "schema": {
2155
+ "type": "array",
2156
+ "items": {
2157
+ "$ref": "#/components/schemas/EventDto"
2158
+ }
2159
+ }
2160
+ }
2161
+ }
2162
+ },
2163
+ "404": {
2164
+ "description": "Series not found"
2165
+ }
2166
+ },
2167
+ "tags": [
2168
+ "event-series"
2169
+ ],
2170
+ "security": [
2171
+ {
2172
+ "api_key": []
2173
+ }
2174
+ ]
2175
+ }
1823
2176
  }
1824
2177
  },
1825
2178
  "info": {
@@ -2114,7 +2467,6 @@
2114
2467
  }
2115
2468
  },
2116
2469
  "required": [
2117
- "displayName",
2118
2470
  "gender",
2119
2471
  "birthDate"
2120
2472
  ]
@@ -2474,6 +2826,11 @@
2474
2826
  "type": "number",
2475
2827
  "description": "Maximum number of attendees allowed (null = unlimited)",
2476
2828
  "example": 100
2829
+ },
2830
+ "seriesId": {
2831
+ "type": "string",
2832
+ "description": "ID of the event series this instance belongs to, if any",
2833
+ "example": "series-weekly-standup"
2477
2834
  }
2478
2835
  },
2479
2836
  "required": [
@@ -2544,13 +2901,7 @@
2544
2901
  "description": "Maximum number of attendees allowed (null = unlimited)",
2545
2902
  "example": 100
2546
2903
  }
2547
- },
2548
- "required": [
2549
- "displayName",
2550
- "startTime",
2551
- "endTime",
2552
- "type"
2553
- ]
2904
+ }
2554
2905
  },
2555
2906
  "MutateEventEntityConnectionDto": {
2556
2907
  "type": "object",
@@ -2791,7 +3142,6 @@
2791
3142
  }
2792
3143
  },
2793
3144
  "required": [
2794
- "displayName",
2795
3145
  "type"
2796
3146
  ]
2797
3147
  },
@@ -2830,6 +3180,274 @@
2830
3180
  "required": [
2831
3181
  "groupIds"
2832
3182
  ]
3183
+ },
3184
+ "CreateEventSeriesDto": {
3185
+ "type": "object",
3186
+ "properties": {
3187
+ "displayName": {
3188
+ "type": "string",
3189
+ "description": "Display name",
3190
+ "example": "Display Name"
3191
+ },
3192
+ "visibility": {
3193
+ "type": "string",
3194
+ "description": "Visibility of the entity",
3195
+ "enum": [
3196
+ "public",
3197
+ "connections",
3198
+ "hidden"
3199
+ ],
3200
+ "example": "public"
3201
+ },
3202
+ "location": {
3203
+ "description": "Optional location information",
3204
+ "allOf": [
3205
+ {
3206
+ "$ref": "#/components/schemas/LocationDto"
3207
+ }
3208
+ ]
3209
+ },
3210
+ "description": {
3211
+ "type": "string",
3212
+ "description": "Entity description",
3213
+ "example": "A description of the entity"
3214
+ },
3215
+ "tags": {
3216
+ "description": "Entity tags",
3217
+ "example": [
3218
+ "tag1",
3219
+ "tag2"
3220
+ ],
3221
+ "type": "array",
3222
+ "items": {
3223
+ "type": "string"
3224
+ }
3225
+ },
3226
+ "seriesId": {
3227
+ "type": "string",
3228
+ "description": "Unique series identifier",
3229
+ "example": "series-weekly-standup"
3230
+ },
3231
+ "type": {
3232
+ "type": "string",
3233
+ "description": "Event type",
3234
+ "example": "standup"
3235
+ },
3236
+ "rrule": {
3237
+ "type": "string",
3238
+ "description": "iCal RRULE string (without DTSTART). Defines the recurrence pattern.",
3239
+ "example": "FREQ=WEEKLY;BYDAY=TH;UNTIL=20261231T000000Z"
3240
+ },
3241
+ "startDate": {
3242
+ "type": "string",
3243
+ "description": "Date of the first occurrence in YYYY-MM-DD format (local date in the given timezone)",
3244
+ "example": "2026-01-08"
3245
+ },
3246
+ "instanceStartTime": {
3247
+ "type": "string",
3248
+ "description": "Start time of each instance in HH:MM format (local time in the given timezone)",
3249
+ "example": "10:00"
3250
+ },
3251
+ "instanceEndTime": {
3252
+ "type": "string",
3253
+ "description": "End time of each instance in HH:MM format (local time in the given timezone)",
3254
+ "example": "11:00"
3255
+ },
3256
+ "timezone": {
3257
+ "type": "string",
3258
+ "description": "IANA timezone for interpreting times and generating instances",
3259
+ "example": "America/New_York"
3260
+ },
3261
+ "associatedGroupId": {
3262
+ "type": "string",
3263
+ "description": "Identifier of the associated group. Owners/admins of the group will be admins of the series.",
3264
+ "example": "group-engineering"
3265
+ },
3266
+ "maxNumAttendees": {
3267
+ "type": "number",
3268
+ "description": "Maximum number of attendees per event instance (null = unlimited)",
3269
+ "example": 50
3270
+ }
3271
+ },
3272
+ "required": [
3273
+ "displayName",
3274
+ "visibility",
3275
+ "seriesId",
3276
+ "type",
3277
+ "rrule",
3278
+ "startDate",
3279
+ "instanceStartTime",
3280
+ "instanceEndTime",
3281
+ "timezone"
3282
+ ]
3283
+ },
3284
+ "EventSeriesDto": {
3285
+ "type": "object",
3286
+ "properties": {
3287
+ "entityId": {
3288
+ "type": "string",
3289
+ "description": "Unique identifier for the entity",
3290
+ "example": "entity-123"
3291
+ },
3292
+ "displayName": {
3293
+ "type": "string",
3294
+ "description": "Display name of the entity",
3295
+ "example": "Sample Entity"
3296
+ },
3297
+ "visibility": {
3298
+ "type": "string",
3299
+ "description": "Visibility of the entity",
3300
+ "enum": [
3301
+ "PUBLIC",
3302
+ "PRIVATE"
3303
+ ],
3304
+ "example": "PUBLIC"
3305
+ },
3306
+ "description": {
3307
+ "type": "string",
3308
+ "description": "Description of the entity",
3309
+ "example": "A description of the entity"
3310
+ },
3311
+ "tags": {
3312
+ "description": "Tags associated with the entity",
3313
+ "example": [
3314
+ "tag1",
3315
+ "tag2"
3316
+ ],
3317
+ "type": "array",
3318
+ "items": {
3319
+ "type": "string"
3320
+ }
3321
+ },
3322
+ "createdAt": {
3323
+ "type": "string",
3324
+ "description": "Date/time the entity was created (ISO string)",
3325
+ "example": "2024-05-01T12:34:56.789Z"
3326
+ },
3327
+ "updatedAt": {
3328
+ "type": "string",
3329
+ "description": "Date/time the entity was last updated (ISO string)",
3330
+ "example": "2024-05-02T12:34:56.789Z"
3331
+ },
3332
+ "location": {
3333
+ "description": "Required location information",
3334
+ "allOf": [
3335
+ {
3336
+ "$ref": "#/components/schemas/LocationDto"
3337
+ }
3338
+ ]
3339
+ },
3340
+ "requesterConnection": {
3341
+ "description": "Connection to the requester",
3342
+ "allOf": [
3343
+ {
3344
+ "$ref": "#/components/schemas/EntityConnectionDto"
3345
+ }
3346
+ ]
3347
+ },
3348
+ "type": {
3349
+ "type": "string",
3350
+ "description": "Event type",
3351
+ "example": "standup"
3352
+ },
3353
+ "rrule": {
3354
+ "type": "string",
3355
+ "description": "iCal RRULE string defining the recurrence pattern",
3356
+ "example": "FREQ=WEEKLY;BYDAY=TH;UNTIL=20261231T000000Z"
3357
+ },
3358
+ "startDate": {
3359
+ "type": "string",
3360
+ "description": "Date of the first occurrence (YYYY-MM-DD, local in timezone)",
3361
+ "example": "2026-01-08"
3362
+ },
3363
+ "instanceStartTime": {
3364
+ "type": "string",
3365
+ "description": "Start time of each instance in HH:MM format",
3366
+ "example": "10:00"
3367
+ },
3368
+ "instanceEndTime": {
3369
+ "type": "string",
3370
+ "description": "End time of each instance in HH:MM format",
3371
+ "example": "11:00"
3372
+ },
3373
+ "timezone": {
3374
+ "type": "string",
3375
+ "description": "IANA timezone for all instances",
3376
+ "example": "America/New_York"
3377
+ },
3378
+ "associatedGroupId": {
3379
+ "type": "string",
3380
+ "description": "Identifier of the associated group",
3381
+ "example": "group-engineering"
3382
+ },
3383
+ "maxNumAttendees": {
3384
+ "type": "number",
3385
+ "description": "Maximum number of attendees per event instance",
3386
+ "example": 50
3387
+ }
3388
+ },
3389
+ "required": [
3390
+ "type",
3391
+ "rrule",
3392
+ "startDate",
3393
+ "instanceStartTime",
3394
+ "instanceEndTime",
3395
+ "timezone"
3396
+ ]
3397
+ },
3398
+ "UpdateEventSeriesDto": {
3399
+ "type": "object",
3400
+ "properties": {
3401
+ "visibility": {
3402
+ "type": "string",
3403
+ "description": "Visibility of the entity",
3404
+ "enum": [
3405
+ "public",
3406
+ "connections",
3407
+ "hidden"
3408
+ ],
3409
+ "example": "public"
3410
+ },
3411
+ "displayName": {
3412
+ "type": "string",
3413
+ "description": "Display name",
3414
+ "example": "Display Name"
3415
+ },
3416
+ "location": {
3417
+ "description": "Optional location information",
3418
+ "allOf": [
3419
+ {
3420
+ "$ref": "#/components/schemas/LocationDto"
3421
+ }
3422
+ ]
3423
+ },
3424
+ "description": {
3425
+ "type": "string",
3426
+ "description": "Entity description",
3427
+ "example": "A description of the entity"
3428
+ },
3429
+ "tags": {
3430
+ "description": "Entity tags",
3431
+ "example": [
3432
+ "tag1",
3433
+ "tag2"
3434
+ ],
3435
+ "type": "array",
3436
+ "items": {
3437
+ "type": "string"
3438
+ }
3439
+ },
3440
+ "type": {
3441
+ "type": "string",
3442
+ "description": "Event type",
3443
+ "example": "standup"
3444
+ },
3445
+ "maxNumAttendees": {
3446
+ "type": "number",
3447
+ "description": "Maximum number of attendees per event instance (null = unlimited)",
3448
+ "example": 50
3449
+ }
3450
+ }
2833
3451
  }
2834
3452
  }
2835
3453
  }
package/openapi.yaml CHANGED
@@ -93,6 +93,20 @@ paths:
93
93
  schema:
94
94
  example: 100
95
95
  type: number
96
+ - name: from
97
+ required: false
98
+ in: query
99
+ description: ISO 8601 date — filter events ending after this time
100
+ schema:
101
+ example: '2025-01-01T00:00:00Z'
102
+ type: string
103
+ - name: to
104
+ required: false
105
+ in: query
106
+ description: ISO 8601 date — filter events starting before this time
107
+ schema:
108
+ example: '2025-12-31T23:59:59Z'
109
+ type: string
96
110
  - name: X-Proxima-Nexus-Requester-User-Id
97
111
  in: header
98
112
  description: >-
@@ -411,6 +425,18 @@ paths:
411
425
  in: path
412
426
  schema:
413
427
  type: string
428
+ - name: from
429
+ required: false
430
+ in: query
431
+ description: 'ISO 8601 start of range (events ending after this time). Default: NOW()'
432
+ schema:
433
+ type: string
434
+ - name: to
435
+ required: false
436
+ in: query
437
+ description: ISO 8601 end of range (events starting before this time)
438
+ schema:
439
+ type: string
414
440
  - name: X-Proxima-Nexus-Requester-User-Id
415
441
  in: header
416
442
  description: >-
@@ -531,6 +557,20 @@ paths:
531
557
  schema:
532
558
  example: 100
533
559
  type: number
560
+ - name: from
561
+ required: false
562
+ in: query
563
+ description: ISO 8601 date — filter events ending after this time
564
+ schema:
565
+ example: '2025-01-01T00:00:00Z'
566
+ type: string
567
+ - name: to
568
+ required: false
569
+ in: query
570
+ description: ISO 8601 date — filter events starting before this time
571
+ schema:
572
+ example: '2025-12-31T23:59:59Z'
573
+ type: string
534
574
  - name: X-Proxima-Nexus-Requester-User-Id
535
575
  in: header
536
576
  description: >-
@@ -583,7 +623,9 @@ paths:
583
623
  - api_key: []
584
624
  put:
585
625
  operationId: EventController_update
586
- summary: Update an event
626
+ summary: >-
627
+ Update an event. For series instances, only the fields provided in the request body will be marked as overridden
628
+ and will no longer be propagated by series-level updates.
587
629
  parameters:
588
630
  - name: eventId
589
631
  required: true
@@ -877,6 +919,20 @@ paths:
877
919
  schema:
878
920
  example: 100
879
921
  type: number
922
+ - name: from
923
+ required: false
924
+ in: query
925
+ description: ISO 8601 date — filter events ending after this time
926
+ schema:
927
+ example: '2025-01-01T00:00:00Z'
928
+ type: string
929
+ - name: to
930
+ required: false
931
+ in: query
932
+ description: ISO 8601 date — filter events starting before this time
933
+ schema:
934
+ example: '2025-12-31T23:59:59Z'
935
+ type: string
880
936
  - name: X-Proxima-Nexus-Requester-User-Id
881
937
  in: header
882
938
  description: >-
@@ -1127,6 +1183,18 @@ paths:
1127
1183
  in: path
1128
1184
  schema:
1129
1185
  type: string
1186
+ - name: from
1187
+ required: false
1188
+ in: query
1189
+ description: 'ISO 8601 start of range (events ending after this time). Default: NOW()'
1190
+ schema:
1191
+ type: string
1192
+ - name: to
1193
+ required: false
1194
+ in: query
1195
+ description: ISO 8601 end of range (events starting before this time)
1196
+ schema:
1197
+ type: string
1130
1198
  - name: X-Proxima-Nexus-Requester-User-Id
1131
1199
  in: header
1132
1200
  description: >-
@@ -1180,6 +1248,170 @@ paths:
1180
1248
  - group
1181
1249
  security:
1182
1250
  - api_key: []
1251
+ /event-series:
1252
+ post:
1253
+ operationId: EventSeriesController_create
1254
+ summary: Create an event series
1255
+ description: >-
1256
+ Creates a series definition and pre-generates all event instances based on the RRULE. The creating user (or
1257
+ associated group) becomes the OWNER.
1258
+ parameters:
1259
+ - name: X-Proxima-Nexus-Requester-User-Id
1260
+ in: header
1261
+ description: ID of the user creating the series
1262
+ required: true
1263
+ schema:
1264
+ type: string
1265
+ requestBody:
1266
+ required: true
1267
+ content:
1268
+ application/json:
1269
+ schema:
1270
+ $ref: '#/components/schemas/CreateEventSeriesDto'
1271
+ responses:
1272
+ '201':
1273
+ description: Created series ID
1274
+ content:
1275
+ application/json:
1276
+ schema:
1277
+ type: string
1278
+ '400':
1279
+ description: Requester user ID missing, or associated group not found
1280
+ '401':
1281
+ description: User cannot create series for the associated group
1282
+ tags:
1283
+ - event-series
1284
+ security:
1285
+ - api_key: []
1286
+ /event-series/{seriesId}:
1287
+ get:
1288
+ operationId: EventSeriesController_get
1289
+ summary: Get an event series by ID
1290
+ parameters:
1291
+ - name: seriesId
1292
+ required: true
1293
+ in: path
1294
+ schema:
1295
+ type: string
1296
+ responses:
1297
+ '200':
1298
+ description: Event series returned
1299
+ content:
1300
+ application/json:
1301
+ schema:
1302
+ $ref: '#/components/schemas/EventSeriesDto'
1303
+ '404':
1304
+ description: Series not found
1305
+ tags:
1306
+ - event-series
1307
+ security:
1308
+ - api_key: []
1309
+ put:
1310
+ operationId: EventSeriesController_update
1311
+ summary: Update an event series
1312
+ description: >-
1313
+ Updates the series definition and propagates metadata changes to all upcoming event instances. Fields that were
1314
+ individually overridden on a specific instance will not be overwritten.
1315
+ parameters:
1316
+ - name: seriesId
1317
+ required: true
1318
+ in: path
1319
+ schema:
1320
+ type: string
1321
+ - name: X-Proxima-Nexus-Requester-User-Id
1322
+ in: header
1323
+ description: ID of the user updating the series
1324
+ required: true
1325
+ schema:
1326
+ type: string
1327
+ requestBody:
1328
+ required: true
1329
+ content:
1330
+ application/json:
1331
+ schema:
1332
+ $ref: '#/components/schemas/UpdateEventSeriesDto'
1333
+ responses:
1334
+ '200':
1335
+ description: Updated series ID
1336
+ content:
1337
+ application/json:
1338
+ schema:
1339
+ type: string
1340
+ '401':
1341
+ description: User cannot edit this series
1342
+ '404':
1343
+ description: Series not found
1344
+ tags:
1345
+ - event-series
1346
+ security:
1347
+ - api_key: []
1348
+ delete:
1349
+ operationId: EventSeriesController_remove
1350
+ summary: Delete an event series
1351
+ description: Deletes the series and all upcoming event instances. Past instances (already started) are preserved.
1352
+ parameters:
1353
+ - name: seriesId
1354
+ required: true
1355
+ in: path
1356
+ schema:
1357
+ type: string
1358
+ - name: X-Proxima-Nexus-Requester-User-Id
1359
+ in: header
1360
+ description: ID of the user deleting the series
1361
+ required: true
1362
+ schema:
1363
+ type: string
1364
+ responses:
1365
+ '204':
1366
+ description: Series deleted
1367
+ '401':
1368
+ description: User cannot delete this series
1369
+ '404':
1370
+ description: Series not found
1371
+ tags:
1372
+ - event-series
1373
+ security:
1374
+ - api_key: []
1375
+ /event-series/{seriesId}/events:
1376
+ get:
1377
+ operationId: EventSeriesController_getInstances
1378
+ summary: List event instances in a series
1379
+ description: >-
1380
+ Returns event instances belonging to this series, ordered by start time. Defaults to only ongoing/upcoming
1381
+ instances.
1382
+ parameters:
1383
+ - name: seriesId
1384
+ required: true
1385
+ in: path
1386
+ schema:
1387
+ type: string
1388
+ - name: from
1389
+ required: false
1390
+ in: query
1391
+ description: 'ISO 8601 start of range (events ending after this time). Default: NOW()'
1392
+ schema:
1393
+ type: string
1394
+ - name: to
1395
+ required: false
1396
+ in: query
1397
+ description: ISO 8601 end of range (events starting before this time)
1398
+ schema:
1399
+ type: string
1400
+ responses:
1401
+ '200':
1402
+ description: Event instances returned
1403
+ content:
1404
+ application/json:
1405
+ schema:
1406
+ type: array
1407
+ items:
1408
+ $ref: '#/components/schemas/EventDto'
1409
+ '404':
1410
+ description: Series not found
1411
+ tags:
1412
+ - event-series
1413
+ security:
1414
+ - api_key: []
1183
1415
  info:
1184
1416
  title: proxima-nexus-data-plane-api
1185
1417
  description: Proxima Nexus Data Plane API
@@ -1397,7 +1629,6 @@ components:
1397
1629
  description: Birth date (ISO 8601)
1398
1630
  example: '1990-01-01'
1399
1631
  required:
1400
- - displayName
1401
1632
  - gender
1402
1633
  - birthDate
1403
1634
  MutateUserConnectionDto:
@@ -1671,6 +1902,10 @@ components:
1671
1902
  type: number
1672
1903
  description: Maximum number of attendees allowed (null = unlimited)
1673
1904
  example: 100
1905
+ seriesId:
1906
+ type: string
1907
+ description: ID of the event series this instance belongs to, if any
1908
+ example: series-weekly-standup
1674
1909
  required:
1675
1910
  - startTime
1676
1911
  - endTime
@@ -1722,11 +1957,6 @@ components:
1722
1957
  type: number
1723
1958
  description: Maximum number of attendees allowed (null = unlimited)
1724
1959
  example: 100
1725
- required:
1726
- - displayName
1727
- - startTime
1728
- - endTime
1729
- - type
1730
1960
  MutateEventEntityConnectionDto:
1731
1961
  type: object
1732
1962
  properties:
@@ -1900,7 +2130,6 @@ components:
1900
2130
  - invite
1901
2131
  example: open
1902
2132
  required:
1903
- - displayName
1904
2133
  - type
1905
2134
  MutateGroupEntityConnectionDto:
1906
2135
  type: object
@@ -1927,3 +2156,204 @@ components:
1927
2156
  type: string
1928
2157
  required:
1929
2158
  - groupIds
2159
+ CreateEventSeriesDto:
2160
+ type: object
2161
+ properties:
2162
+ displayName:
2163
+ type: string
2164
+ description: Display name
2165
+ example: Display Name
2166
+ visibility:
2167
+ type: string
2168
+ description: Visibility of the entity
2169
+ enum:
2170
+ - public
2171
+ - connections
2172
+ - hidden
2173
+ example: public
2174
+ location:
2175
+ description: Optional location information
2176
+ allOf:
2177
+ - $ref: '#/components/schemas/LocationDto'
2178
+ description:
2179
+ type: string
2180
+ description: Entity description
2181
+ example: A description of the entity
2182
+ tags:
2183
+ description: Entity tags
2184
+ example:
2185
+ - tag1
2186
+ - tag2
2187
+ type: array
2188
+ items:
2189
+ type: string
2190
+ seriesId:
2191
+ type: string
2192
+ description: Unique series identifier
2193
+ example: series-weekly-standup
2194
+ type:
2195
+ type: string
2196
+ description: Event type
2197
+ example: standup
2198
+ rrule:
2199
+ type: string
2200
+ description: iCal RRULE string (without DTSTART). Defines the recurrence pattern.
2201
+ example: FREQ=WEEKLY;BYDAY=TH;UNTIL=20261231T000000Z
2202
+ startDate:
2203
+ type: string
2204
+ description: Date of the first occurrence in YYYY-MM-DD format (local date in the given timezone)
2205
+ example: '2026-01-08'
2206
+ instanceStartTime:
2207
+ type: string
2208
+ description: Start time of each instance in HH:MM format (local time in the given timezone)
2209
+ example: '10:00'
2210
+ instanceEndTime:
2211
+ type: string
2212
+ description: End time of each instance in HH:MM format (local time in the given timezone)
2213
+ example: '11:00'
2214
+ timezone:
2215
+ type: string
2216
+ description: IANA timezone for interpreting times and generating instances
2217
+ example: America/New_York
2218
+ associatedGroupId:
2219
+ type: string
2220
+ description: Identifier of the associated group. Owners/admins of the group will be admins of the series.
2221
+ example: group-engineering
2222
+ maxNumAttendees:
2223
+ type: number
2224
+ description: Maximum number of attendees per event instance (null = unlimited)
2225
+ example: 50
2226
+ required:
2227
+ - displayName
2228
+ - visibility
2229
+ - seriesId
2230
+ - type
2231
+ - rrule
2232
+ - startDate
2233
+ - instanceStartTime
2234
+ - instanceEndTime
2235
+ - timezone
2236
+ EventSeriesDto:
2237
+ type: object
2238
+ properties:
2239
+ entityId:
2240
+ type: string
2241
+ description: Unique identifier for the entity
2242
+ example: entity-123
2243
+ displayName:
2244
+ type: string
2245
+ description: Display name of the entity
2246
+ example: Sample Entity
2247
+ visibility:
2248
+ type: string
2249
+ description: Visibility of the entity
2250
+ enum:
2251
+ - PUBLIC
2252
+ - PRIVATE
2253
+ example: PUBLIC
2254
+ description:
2255
+ type: string
2256
+ description: Description of the entity
2257
+ example: A description of the entity
2258
+ tags:
2259
+ description: Tags associated with the entity
2260
+ example:
2261
+ - tag1
2262
+ - tag2
2263
+ type: array
2264
+ items:
2265
+ type: string
2266
+ createdAt:
2267
+ type: string
2268
+ description: Date/time the entity was created (ISO string)
2269
+ example: '2024-05-01T12:34:56.789Z'
2270
+ updatedAt:
2271
+ type: string
2272
+ description: Date/time the entity was last updated (ISO string)
2273
+ example: '2024-05-02T12:34:56.789Z'
2274
+ location:
2275
+ description: Required location information
2276
+ allOf:
2277
+ - $ref: '#/components/schemas/LocationDto'
2278
+ requesterConnection:
2279
+ description: Connection to the requester
2280
+ allOf:
2281
+ - $ref: '#/components/schemas/EntityConnectionDto'
2282
+ type:
2283
+ type: string
2284
+ description: Event type
2285
+ example: standup
2286
+ rrule:
2287
+ type: string
2288
+ description: iCal RRULE string defining the recurrence pattern
2289
+ example: FREQ=WEEKLY;BYDAY=TH;UNTIL=20261231T000000Z
2290
+ startDate:
2291
+ type: string
2292
+ description: Date of the first occurrence (YYYY-MM-DD, local in timezone)
2293
+ example: '2026-01-08'
2294
+ instanceStartTime:
2295
+ type: string
2296
+ description: Start time of each instance in HH:MM format
2297
+ example: '10:00'
2298
+ instanceEndTime:
2299
+ type: string
2300
+ description: End time of each instance in HH:MM format
2301
+ example: '11:00'
2302
+ timezone:
2303
+ type: string
2304
+ description: IANA timezone for all instances
2305
+ example: America/New_York
2306
+ associatedGroupId:
2307
+ type: string
2308
+ description: Identifier of the associated group
2309
+ example: group-engineering
2310
+ maxNumAttendees:
2311
+ type: number
2312
+ description: Maximum number of attendees per event instance
2313
+ example: 50
2314
+ required:
2315
+ - type
2316
+ - rrule
2317
+ - startDate
2318
+ - instanceStartTime
2319
+ - instanceEndTime
2320
+ - timezone
2321
+ UpdateEventSeriesDto:
2322
+ type: object
2323
+ properties:
2324
+ visibility:
2325
+ type: string
2326
+ description: Visibility of the entity
2327
+ enum:
2328
+ - public
2329
+ - connections
2330
+ - hidden
2331
+ example: public
2332
+ displayName:
2333
+ type: string
2334
+ description: Display name
2335
+ example: Display Name
2336
+ location:
2337
+ description: Optional location information
2338
+ allOf:
2339
+ - $ref: '#/components/schemas/LocationDto'
2340
+ description:
2341
+ type: string
2342
+ description: Entity description
2343
+ example: A description of the entity
2344
+ tags:
2345
+ description: Entity tags
2346
+ example:
2347
+ - tag1
2348
+ - tag2
2349
+ type: array
2350
+ items:
2351
+ type: string
2352
+ type:
2353
+ type: string
2354
+ description: Event type
2355
+ example: standup
2356
+ maxNumAttendees:
2357
+ type: number
2358
+ description: Maximum number of attendees per event instance (null = unlimited)
2359
+ example: 50
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proxima-nexus/openapi",
3
- "version": "2.0.1",
3
+ "version": "2.2.0",
4
4
  "description": "OpenAPI specification for Proxima Nexus",
5
5
  "main": "openapi.json",
6
6
  "types": "openapi.json",