@remit/api-openapi-spec 0.0.79 → 0.0.81

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/openapi.json CHANGED
@@ -2601,7 +2601,7 @@
2601
2601
  },
2602
2602
  "delete": {
2603
2603
  "operationId": "CalendarEventDetailOperations_deleteCalendarEvent",
2604
- "description": "Delete an event. `All` removes the resource and every occurrence it\nproduced; `This` writes an EXDATE for the named occurrence and keeps the\nrest of the series; `Following` truncates the series to end just before\nit.\n\nSame refusals and the same `If-Match` precondition as the update.\nAn event in a `Subscribed` collection is refused with 400\n`read_only_calendar`, here and on the update.",
2604
+ "description": "Delete an event. `All` removes the resource and every occurrence it\nproduced; `This` writes an EXDATE for the named occurrence and keeps the\nrest of the series; `Following` truncates the series to end just before\nit.\n\nSame refusals and the same `If-Match` precondition as the update.\nAn event in a `Subscribed` collection is refused with 400\n`read_only_calendar`, here and on the update.\n\nAnswers 200 with the cancellations it queued: one per guest when the\nreader organizes the event, none otherwise.",
2605
2605
  "parameters": [
2606
2606
  {
2607
2607
  "name": "calendarObjectId",
@@ -2648,8 +2648,15 @@
2648
2648
  }
2649
2649
  ],
2650
2650
  "responses": {
2651
- "204": {
2652
- "description": "Nothing to return. The resource, or the occurrence, is gone."
2651
+ "200": {
2652
+ "description": "What deleting an event sent: one cancellation per guest when the reader organizes it, nothing otherwise.",
2653
+ "content": {
2654
+ "application/json": {
2655
+ "schema": {
2656
+ "$ref": "#/components/schemas/RemitImap.CalendarEventDeleteResponse"
2657
+ }
2658
+ }
2659
+ }
2653
2660
  },
2654
2661
  "400": {
2655
2662
  "description": "The request was refused as malformed or contradictory. `code` is\n`invalid_request` where nothing more specific is known, and the refusal's own\ntoken where there is one.\n\nThe calendar surface answers with the reason it read the request by:\n`invalid_window`, `invalid_scope`, `invalid_url_segment`, `url_segment_taken`,\n`unknown_time_zone` and `default_calendar_undeletable` on the collection and\nthe query, and, for a VCALENDAR it could not accept,\n`malformed_icalendar`, `not_a_calendar`, `unsupported_component`, `no_event`,\n`no_master_event`, `multiple_master_events`, `missing_uid`, `mismatched_uid`,\n`missing_dt_start`, `backwards_end`, `invalid_date_time`,\n`invalid_recurrence_rule`, `missing_recurrence_id`, `not_recurring`,\n`unknown_occurrence` and `unmovable_recurrence_rule`. The outbox answers `mail_sync_off` to a\nsend from an account whose `syncedServices` leave out `Mail`, with the\naccount in `details.accountId`.\n\n`errors` is present only when the request failed schema validation before any\nhandler ran, and names every field that was refused.",
@@ -3135,6 +3142,398 @@
3135
3142
  }
3136
3143
  }
3137
3144
  },
3145
+ "/calendar-tasks": {
3146
+ "get": {
3147
+ "operationId": "CalendarTaskOperations_listCalendarTasks",
3148
+ "description": "Tasks due in a window, across every task collection the caller holds, in due order. Refused with 400 on the same window rules as the event listing.",
3149
+ "parameters": [
3150
+ {
3151
+ "name": "from",
3152
+ "in": "query",
3153
+ "required": true,
3154
+ "description": "Start of the window, an ISO 8601 date-time with zone offset. Inclusive.",
3155
+ "schema": {
3156
+ "type": "string"
3157
+ }
3158
+ },
3159
+ {
3160
+ "name": "to",
3161
+ "in": "query",
3162
+ "required": true,
3163
+ "description": "End of the window, an ISO 8601 date-time with zone offset. Exclusive.",
3164
+ "schema": {
3165
+ "type": "string"
3166
+ }
3167
+ },
3168
+ {
3169
+ "name": "calendarId",
3170
+ "in": "query",
3171
+ "required": false,
3172
+ "description": "Restrict to these task collections, repeated once per calendar. Omitted means every one the caller holds.",
3173
+ "schema": {
3174
+ "type": "array",
3175
+ "items": {
3176
+ "$ref": "#/components/schemas/UUID"
3177
+ }
3178
+ }
3179
+ }
3180
+ ],
3181
+ "responses": {
3182
+ "200": {
3183
+ "description": "The request has succeeded.",
3184
+ "content": {
3185
+ "application/json": {
3186
+ "schema": {
3187
+ "$ref": "#/components/schemas/RemitImap.CalendarTaskListResponse"
3188
+ }
3189
+ }
3190
+ }
3191
+ },
3192
+ "400": {
3193
+ "description": "The request was refused as malformed or contradictory. `code` is\n`invalid_request` where nothing more specific is known, and the refusal's own\ntoken where there is one.\n\nThe calendar surface answers with the reason it read the request by:\n`invalid_window`, `invalid_scope`, `invalid_url_segment`, `url_segment_taken`,\n`unknown_time_zone` and `default_calendar_undeletable` on the collection and\nthe query, and, for a VCALENDAR it could not accept,\n`malformed_icalendar`, `not_a_calendar`, `unsupported_component`, `no_event`,\n`no_master_event`, `multiple_master_events`, `missing_uid`, `mismatched_uid`,\n`missing_dt_start`, `backwards_end`, `invalid_date_time`,\n`invalid_recurrence_rule`, `missing_recurrence_id`, `not_recurring`,\n`unknown_occurrence` and `unmovable_recurrence_rule`. The outbox answers `mail_sync_off` to a\nsend from an account whose `syncedServices` leave out `Mail`, with the\naccount in `details.accountId`.\n\n`errors` is present only when the request failed schema validation before any\nhandler ran, and names every field that was refused.",
3194
+ "content": {
3195
+ "application/json": {
3196
+ "schema": {
3197
+ "$ref": "#/components/schemas/ValidationError"
3198
+ }
3199
+ }
3200
+ }
3201
+ },
3202
+ "401": {
3203
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
3204
+ "content": {
3205
+ "application/json": {
3206
+ "schema": {
3207
+ "$ref": "#/components/schemas/ApiError"
3208
+ }
3209
+ }
3210
+ }
3211
+ },
3212
+ "404": {
3213
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
3214
+ "content": {
3215
+ "application/json": {
3216
+ "schema": {
3217
+ "$ref": "#/components/schemas/ApiError"
3218
+ }
3219
+ }
3220
+ }
3221
+ }
3222
+ },
3223
+ "x-amazon-apigateway-integration": {
3224
+ "type": "aws_proxy",
3225
+ "httpMethod": "POST",
3226
+ "passthroughBehavior": "when_no_match",
3227
+ "uri": {
3228
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
3229
+ }
3230
+ }
3231
+ },
3232
+ "post": {
3233
+ "operationId": "CalendarTaskOperations_createCalendarTask",
3234
+ "description": "Create a task. Refused with 400 `not_a_task_calendar` when `calendarId` names an event collection.",
3235
+ "parameters": [],
3236
+ "responses": {
3237
+ "200": {
3238
+ "description": "The request has succeeded.",
3239
+ "content": {
3240
+ "application/json": {
3241
+ "schema": {
3242
+ "$ref": "#/components/schemas/RemitImap.CalendarTaskResponse"
3243
+ }
3244
+ }
3245
+ }
3246
+ },
3247
+ "400": {
3248
+ "description": "The request was refused as malformed or contradictory. `code` is\n`invalid_request` where nothing more specific is known, and the refusal's own\ntoken where there is one.\n\nThe calendar surface answers with the reason it read the request by:\n`invalid_window`, `invalid_scope`, `invalid_url_segment`, `url_segment_taken`,\n`unknown_time_zone` and `default_calendar_undeletable` on the collection and\nthe query, and, for a VCALENDAR it could not accept,\n`malformed_icalendar`, `not_a_calendar`, `unsupported_component`, `no_event`,\n`no_master_event`, `multiple_master_events`, `missing_uid`, `mismatched_uid`,\n`missing_dt_start`, `backwards_end`, `invalid_date_time`,\n`invalid_recurrence_rule`, `missing_recurrence_id`, `not_recurring`,\n`unknown_occurrence` and `unmovable_recurrence_rule`. The outbox answers `mail_sync_off` to a\nsend from an account whose `syncedServices` leave out `Mail`, with the\naccount in `details.accountId`.\n\n`errors` is present only when the request failed schema validation before any\nhandler ran, and names every field that was refused.",
3249
+ "content": {
3250
+ "application/json": {
3251
+ "schema": {
3252
+ "$ref": "#/components/schemas/ValidationError"
3253
+ }
3254
+ }
3255
+ }
3256
+ },
3257
+ "401": {
3258
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
3259
+ "content": {
3260
+ "application/json": {
3261
+ "schema": {
3262
+ "$ref": "#/components/schemas/ApiError"
3263
+ }
3264
+ }
3265
+ }
3266
+ },
3267
+ "404": {
3268
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
3269
+ "content": {
3270
+ "application/json": {
3271
+ "schema": {
3272
+ "$ref": "#/components/schemas/ApiError"
3273
+ }
3274
+ }
3275
+ }
3276
+ }
3277
+ },
3278
+ "requestBody": {
3279
+ "required": true,
3280
+ "content": {
3281
+ "application/json": {
3282
+ "schema": {
3283
+ "$ref": "#/components/schemas/RemitImap.CreateCalendarTaskInput"
3284
+ }
3285
+ }
3286
+ }
3287
+ },
3288
+ "x-amazon-apigateway-integration": {
3289
+ "type": "aws_proxy",
3290
+ "httpMethod": "POST",
3291
+ "passthroughBehavior": "when_no_match",
3292
+ "uri": {
3293
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
3294
+ }
3295
+ }
3296
+ }
3297
+ },
3298
+ "/calendar-tasks/{calendarTaskId}": {
3299
+ "get": {
3300
+ "operationId": "CalendarTaskDetailOperations_getCalendarTask",
3301
+ "parameters": [
3302
+ {
3303
+ "name": "calendarTaskId",
3304
+ "in": "path",
3305
+ "required": true,
3306
+ "schema": {
3307
+ "$ref": "#/components/schemas/UUID"
3308
+ }
3309
+ },
3310
+ {
3311
+ "name": "calendarId",
3312
+ "in": "query",
3313
+ "required": false,
3314
+ "description": "Collection the task lives in. Omitted, it is looked for in every task collection the caller holds.",
3315
+ "schema": {
3316
+ "$ref": "#/components/schemas/UUID"
3317
+ }
3318
+ }
3319
+ ],
3320
+ "responses": {
3321
+ "200": {
3322
+ "description": "The request has succeeded.",
3323
+ "content": {
3324
+ "application/json": {
3325
+ "schema": {
3326
+ "$ref": "#/components/schemas/RemitImap.CalendarTaskResponse"
3327
+ }
3328
+ }
3329
+ }
3330
+ },
3331
+ "401": {
3332
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
3333
+ "content": {
3334
+ "application/json": {
3335
+ "schema": {
3336
+ "$ref": "#/components/schemas/ApiError"
3337
+ }
3338
+ }
3339
+ }
3340
+ },
3341
+ "404": {
3342
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
3343
+ "content": {
3344
+ "application/json": {
3345
+ "schema": {
3346
+ "$ref": "#/components/schemas/ApiError"
3347
+ }
3348
+ }
3349
+ }
3350
+ }
3351
+ },
3352
+ "x-amazon-apigateway-integration": {
3353
+ "type": "aws_proxy",
3354
+ "httpMethod": "POST",
3355
+ "passthroughBehavior": "when_no_match",
3356
+ "uri": {
3357
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
3358
+ }
3359
+ }
3360
+ },
3361
+ "patch": {
3362
+ "operationId": "CalendarTaskDetailOperations_updateCalendarTask",
3363
+ "description": "Update a task. `If-Match` makes the write conditional on the etag the caller read; a mismatch is 412.",
3364
+ "parameters": [
3365
+ {
3366
+ "name": "calendarTaskId",
3367
+ "in": "path",
3368
+ "required": true,
3369
+ "schema": {
3370
+ "$ref": "#/components/schemas/UUID"
3371
+ }
3372
+ },
3373
+ {
3374
+ "name": "calendarId",
3375
+ "in": "query",
3376
+ "required": true,
3377
+ "description": "Collection the task lives in",
3378
+ "schema": {
3379
+ "$ref": "#/components/schemas/UUID"
3380
+ }
3381
+ },
3382
+ {
3383
+ "name": "If-Match",
3384
+ "in": "header",
3385
+ "required": false,
3386
+ "schema": {
3387
+ "type": "string"
3388
+ }
3389
+ }
3390
+ ],
3391
+ "responses": {
3392
+ "200": {
3393
+ "description": "The request has succeeded.",
3394
+ "content": {
3395
+ "application/json": {
3396
+ "schema": {
3397
+ "$ref": "#/components/schemas/RemitImap.CalendarTaskResponse"
3398
+ }
3399
+ }
3400
+ }
3401
+ },
3402
+ "400": {
3403
+ "description": "The request was refused as malformed or contradictory. `code` is\n`invalid_request` where nothing more specific is known, and the refusal's own\ntoken where there is one.\n\nThe calendar surface answers with the reason it read the request by:\n`invalid_window`, `invalid_scope`, `invalid_url_segment`, `url_segment_taken`,\n`unknown_time_zone` and `default_calendar_undeletable` on the collection and\nthe query, and, for a VCALENDAR it could not accept,\n`malformed_icalendar`, `not_a_calendar`, `unsupported_component`, `no_event`,\n`no_master_event`, `multiple_master_events`, `missing_uid`, `mismatched_uid`,\n`missing_dt_start`, `backwards_end`, `invalid_date_time`,\n`invalid_recurrence_rule`, `missing_recurrence_id`, `not_recurring`,\n`unknown_occurrence` and `unmovable_recurrence_rule`. The outbox answers `mail_sync_off` to a\nsend from an account whose `syncedServices` leave out `Mail`, with the\naccount in `details.accountId`.\n\n`errors` is present only when the request failed schema validation before any\nhandler ran, and names every field that was refused.",
3404
+ "content": {
3405
+ "application/json": {
3406
+ "schema": {
3407
+ "$ref": "#/components/schemas/ValidationError"
3408
+ }
3409
+ }
3410
+ }
3411
+ },
3412
+ "401": {
3413
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
3414
+ "content": {
3415
+ "application/json": {
3416
+ "schema": {
3417
+ "$ref": "#/components/schemas/ApiError"
3418
+ }
3419
+ }
3420
+ }
3421
+ },
3422
+ "404": {
3423
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
3424
+ "content": {
3425
+ "application/json": {
3426
+ "schema": {
3427
+ "$ref": "#/components/schemas/ApiError"
3428
+ }
3429
+ }
3430
+ }
3431
+ },
3432
+ "412": {
3433
+ "description": "The condition the request stated is no longer true. Answered when an\n`If-Match` names an etag the stored resource no longer carries: somebody else\nwrote it in between, so applying this request would silently discard their\nchange. The client re-reads the resource and decides what to do with the\nversion it now has. `code` is `precondition_failed`.",
3434
+ "content": {
3435
+ "application/json": {
3436
+ "schema": {
3437
+ "$ref": "#/components/schemas/ApiError"
3438
+ }
3439
+ }
3440
+ }
3441
+ }
3442
+ },
3443
+ "requestBody": {
3444
+ "required": true,
3445
+ "content": {
3446
+ "application/json": {
3447
+ "schema": {
3448
+ "$ref": "#/components/schemas/RemitImap.UpdateCalendarTaskInput"
3449
+ }
3450
+ }
3451
+ }
3452
+ },
3453
+ "x-amazon-apigateway-integration": {
3454
+ "type": "aws_proxy",
3455
+ "httpMethod": "POST",
3456
+ "passthroughBehavior": "when_no_match",
3457
+ "uri": {
3458
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
3459
+ }
3460
+ }
3461
+ },
3462
+ "delete": {
3463
+ "operationId": "CalendarTaskDetailOperations_deleteCalendarTask",
3464
+ "description": "Delete a task. Same `If-Match` precondition as the update.",
3465
+ "parameters": [
3466
+ {
3467
+ "name": "calendarTaskId",
3468
+ "in": "path",
3469
+ "required": true,
3470
+ "schema": {
3471
+ "$ref": "#/components/schemas/UUID"
3472
+ }
3473
+ },
3474
+ {
3475
+ "name": "calendarId",
3476
+ "in": "query",
3477
+ "required": true,
3478
+ "description": "Collection the task lives in",
3479
+ "schema": {
3480
+ "$ref": "#/components/schemas/UUID"
3481
+ }
3482
+ },
3483
+ {
3484
+ "name": "If-Match",
3485
+ "in": "header",
3486
+ "required": false,
3487
+ "schema": {
3488
+ "type": "string"
3489
+ }
3490
+ }
3491
+ ],
3492
+ "responses": {
3493
+ "204": {
3494
+ "description": "Nothing to return. The resource, or the occurrence, is gone."
3495
+ },
3496
+ "401": {
3497
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
3498
+ "content": {
3499
+ "application/json": {
3500
+ "schema": {
3501
+ "$ref": "#/components/schemas/ApiError"
3502
+ }
3503
+ }
3504
+ }
3505
+ },
3506
+ "404": {
3507
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
3508
+ "content": {
3509
+ "application/json": {
3510
+ "schema": {
3511
+ "$ref": "#/components/schemas/ApiError"
3512
+ }
3513
+ }
3514
+ }
3515
+ },
3516
+ "412": {
3517
+ "description": "The condition the request stated is no longer true. Answered when an\n`If-Match` names an etag the stored resource no longer carries: somebody else\nwrote it in between, so applying this request would silently discard their\nchange. The client re-reads the resource and decides what to do with the\nversion it now has. `code` is `precondition_failed`.",
3518
+ "content": {
3519
+ "application/json": {
3520
+ "schema": {
3521
+ "$ref": "#/components/schemas/ApiError"
3522
+ }
3523
+ }
3524
+ }
3525
+ }
3526
+ },
3527
+ "x-amazon-apigateway-integration": {
3528
+ "type": "aws_proxy",
3529
+ "httpMethod": "POST",
3530
+ "passthroughBehavior": "when_no_match",
3531
+ "uri": {
3532
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
3533
+ }
3534
+ }
3535
+ }
3536
+ },
3138
3537
  "/calendars": {
3139
3538
  "get": {
3140
3539
  "operationId": "CalendarOperations_listCalendars",
@@ -5537,37 +5936,150 @@
5537
5936
  "content": {
5538
5937
  "application/json": {
5539
5938
  "schema": {
5540
- "$ref": "#/components/schemas/RemitImap.OutboxAttachmentResponse"
5939
+ "$ref": "#/components/schemas/RemitImap.OutboxAttachmentResponse"
5940
+ }
5941
+ }
5942
+ }
5943
+ },
5944
+ "400": {
5945
+ "description": "Refusal response for an attachment. Flat, like every other error body.",
5946
+ "content": {
5947
+ "application/json": {
5948
+ "schema": {
5949
+ "$ref": "#/components/schemas/RemitImap.OutboxAttachmentRejection"
5950
+ }
5951
+ }
5952
+ }
5953
+ },
5954
+ "401": {
5955
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
5956
+ "content": {
5957
+ "application/json": {
5958
+ "schema": {
5959
+ "$ref": "#/components/schemas/ApiError"
5960
+ }
5961
+ }
5962
+ }
5963
+ },
5964
+ "413": {
5965
+ "description": "Refusal response for an attachment. Flat, like every other error body.",
5966
+ "content": {
5967
+ "application/json": {
5968
+ "schema": {
5969
+ "$ref": "#/components/schemas/RemitImap.OutboxAttachmentRejection"
5970
+ }
5971
+ }
5972
+ }
5973
+ }
5974
+ },
5975
+ "x-amazon-apigateway-integration": {
5976
+ "type": "aws_proxy",
5977
+ "httpMethod": "POST",
5978
+ "passthroughBehavior": "when_no_match",
5979
+ "uri": {
5980
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
5981
+ }
5982
+ }
5983
+ }
5984
+ },
5985
+ "/outbox/{outboxMessageId}/send": {
5986
+ "post": {
5987
+ "operationId": "OutboxDetailOperations_sendOutboxMessage",
5988
+ "description": "Queue a draft message for sending. A draft on an account whose syncedServices leave out Mail is refused with 400 `mail_sync_off`, and stays a draft.",
5989
+ "parameters": [
5990
+ {
5991
+ "name": "outboxMessageId",
5992
+ "in": "path",
5993
+ "required": true,
5994
+ "schema": {
5995
+ "$ref": "#/components/schemas/UUID"
5996
+ }
5997
+ }
5998
+ ],
5999
+ "responses": {
6000
+ "200": {
6001
+ "description": "The request has succeeded.",
6002
+ "content": {
6003
+ "application/json": {
6004
+ "schema": {
6005
+ "$ref": "#/components/schemas/RemitImap.OutboxMessageResponse"
6006
+ }
6007
+ }
6008
+ }
6009
+ },
6010
+ "400": {
6011
+ "description": "The request was refused as malformed or contradictory. `code` is\n`invalid_request` where nothing more specific is known, and the refusal's own\ntoken where there is one.\n\nThe calendar surface answers with the reason it read the request by:\n`invalid_window`, `invalid_scope`, `invalid_url_segment`, `url_segment_taken`,\n`unknown_time_zone` and `default_calendar_undeletable` on the collection and\nthe query, and, for a VCALENDAR it could not accept,\n`malformed_icalendar`, `not_a_calendar`, `unsupported_component`, `no_event`,\n`no_master_event`, `multiple_master_events`, `missing_uid`, `mismatched_uid`,\n`missing_dt_start`, `backwards_end`, `invalid_date_time`,\n`invalid_recurrence_rule`, `missing_recurrence_id`, `not_recurring`,\n`unknown_occurrence` and `unmovable_recurrence_rule`. The outbox answers `mail_sync_off` to a\nsend from an account whose `syncedServices` leave out `Mail`, with the\naccount in `details.accountId`.\n\n`errors` is present only when the request failed schema validation before any\nhandler ran, and names every field that was refused.",
6012
+ "content": {
6013
+ "application/json": {
6014
+ "schema": {
6015
+ "$ref": "#/components/schemas/ValidationError"
6016
+ }
6017
+ }
6018
+ }
6019
+ },
6020
+ "401": {
6021
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
6022
+ "content": {
6023
+ "application/json": {
6024
+ "schema": {
6025
+ "$ref": "#/components/schemas/ApiError"
6026
+ }
6027
+ }
6028
+ }
6029
+ },
6030
+ "403": {
6031
+ "description": "The caller is known and may not do this. `code` is `forbidden`.",
6032
+ "content": {
6033
+ "application/json": {
6034
+ "schema": {
6035
+ "$ref": "#/components/schemas/ApiError"
5541
6036
  }
5542
6037
  }
5543
6038
  }
5544
6039
  },
5545
- "400": {
5546
- "description": "Refusal response for an attachment. Flat, like every other error body.",
6040
+ "404": {
6041
+ "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
5547
6042
  "content": {
5548
6043
  "application/json": {
5549
6044
  "schema": {
5550
- "$ref": "#/components/schemas/RemitImap.OutboxAttachmentRejection"
6045
+ "$ref": "#/components/schemas/ApiError"
5551
6046
  }
5552
6047
  }
5553
6048
  }
5554
- },
5555
- "401": {
5556
- "description": "The request carried no usable credential. `code` is `unauthorized`.",
6049
+ }
6050
+ },
6051
+ "x-amazon-apigateway-integration": {
6052
+ "type": "aws_proxy",
6053
+ "httpMethod": "POST",
6054
+ "passthroughBehavior": "when_no_match",
6055
+ "uri": {
6056
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
6057
+ }
6058
+ }
6059
+ }
6060
+ },
6061
+ "/settings": {
6062
+ "get": {
6063
+ "operationId": "UserSettingsOperations_getUserSettings",
6064
+ "description": "Read the caller's settings.",
6065
+ "parameters": [],
6066
+ "responses": {
6067
+ "200": {
6068
+ "description": "The request has succeeded.",
5557
6069
  "content": {
5558
6070
  "application/json": {
5559
6071
  "schema": {
5560
- "$ref": "#/components/schemas/ApiError"
6072
+ "$ref": "#/components/schemas/RemitImap.UserSettingsResponse"
5561
6073
  }
5562
6074
  }
5563
6075
  }
5564
6076
  },
5565
- "413": {
5566
- "description": "Refusal response for an attachment. Flat, like every other error body.",
6077
+ "401": {
6078
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
5567
6079
  "content": {
5568
6080
  "application/json": {
5569
6081
  "schema": {
5570
- "$ref": "#/components/schemas/RemitImap.OutboxAttachmentRejection"
6082
+ "$ref": "#/components/schemas/ApiError"
5571
6083
  }
5572
6084
  }
5573
6085
  }
@@ -5581,29 +6093,18 @@
5581
6093
  "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
5582
6094
  }
5583
6095
  }
5584
- }
5585
- },
5586
- "/outbox/{outboxMessageId}/send": {
5587
- "post": {
5588
- "operationId": "OutboxDetailOperations_sendOutboxMessage",
5589
- "description": "Queue a draft message for sending. A draft on an account whose syncedServices leave out Mail is refused with 400 `mail_sync_off`, and stays a draft.",
5590
- "parameters": [
5591
- {
5592
- "name": "outboxMessageId",
5593
- "in": "path",
5594
- "required": true,
5595
- "schema": {
5596
- "$ref": "#/components/schemas/UUID"
5597
- }
5598
- }
5599
- ],
6096
+ },
6097
+ "patch": {
6098
+ "operationId": "UserSettingsOperations_updateUserSettings",
6099
+ "description": "Change the caller's settings. Answers with every setting as it now stands.",
6100
+ "parameters": [],
5600
6101
  "responses": {
5601
6102
  "200": {
5602
6103
  "description": "The request has succeeded.",
5603
6104
  "content": {
5604
6105
  "application/json": {
5605
6106
  "schema": {
5606
- "$ref": "#/components/schemas/RemitImap.OutboxMessageResponse"
6107
+ "$ref": "#/components/schemas/RemitImap.UserSettingsResponse"
5607
6108
  }
5608
6109
  }
5609
6110
  }
@@ -5627,19 +6128,46 @@
5627
6128
  }
5628
6129
  }
5629
6130
  }
5630
- },
5631
- "403": {
5632
- "description": "The caller is known and may not do this. `code` is `forbidden`.",
6131
+ }
6132
+ },
6133
+ "requestBody": {
6134
+ "required": true,
6135
+ "content": {
6136
+ "application/json": {
6137
+ "schema": {
6138
+ "$ref": "#/components/schemas/RemitImap.UpdateUserSettingsInput"
6139
+ }
6140
+ }
6141
+ }
6142
+ },
6143
+ "x-amazon-apigateway-integration": {
6144
+ "type": "aws_proxy",
6145
+ "httpMethod": "POST",
6146
+ "passthroughBehavior": "when_no_match",
6147
+ "uri": {
6148
+ "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
6149
+ }
6150
+ }
6151
+ }
6152
+ },
6153
+ "/settings/default-invitation-sender": {
6154
+ "delete": {
6155
+ "operationId": "UserSettingsOperations_clearDefaultInvitationSender",
6156
+ "description": "Clear the chosen default invitation sender. Invitations then go out from the account an event is on. Answers with every setting as it now stands.",
6157
+ "parameters": [],
6158
+ "responses": {
6159
+ "200": {
6160
+ "description": "The request has succeeded.",
5633
6161
  "content": {
5634
6162
  "application/json": {
5635
6163
  "schema": {
5636
- "$ref": "#/components/schemas/ApiError"
6164
+ "$ref": "#/components/schemas/RemitImap.UserSettingsResponse"
5637
6165
  }
5638
6166
  }
5639
6167
  }
5640
6168
  },
5641
- "404": {
5642
- "description": "Nothing answers to this address, or the caller may not learn that something does. `code` is `not_found`.",
6169
+ "401": {
6170
+ "description": "The request carried no usable credential. `code` is `unauthorized`.",
5643
6171
  "content": {
5644
6172
  "application/json": {
5645
6173
  "schema": {
@@ -7116,6 +7644,117 @@
7116
7644
  ],
7117
7645
  "description": "Whether an answered cancellation holds the calendar object this suggestion's answer wrote. A cancellation is terminal, so such an answer cannot be taken back."
7118
7646
  },
7647
+ "RemitImap.CalendarAttendee": {
7648
+ "type": "object",
7649
+ "required": [
7650
+ "email",
7651
+ "displayName",
7652
+ "role",
7653
+ "status"
7654
+ ],
7655
+ "properties": {
7656
+ "email": {
7657
+ "allOf": [
7658
+ {
7659
+ "$ref": "#/components/schemas/String512"
7660
+ }
7661
+ ],
7662
+ "description": "Mail address, lower-cased"
7663
+ },
7664
+ "displayName": {
7665
+ "allOf": [
7666
+ {
7667
+ "$ref": "#/components/schemas/String512"
7668
+ }
7669
+ ],
7670
+ "description": "The CN parameter. `\"\"` when the line carries none."
7671
+ },
7672
+ "role": {
7673
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendeeRole"
7674
+ },
7675
+ "status": {
7676
+ "allOf": [
7677
+ {
7678
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendeeStatus"
7679
+ }
7680
+ ],
7681
+ "description": "The answer. The organizer reads as `Accepted`."
7682
+ }
7683
+ },
7684
+ "description": "One person on an event's guest list, read from its ORGANIZER and ATTENDEE lines."
7685
+ },
7686
+ "RemitImap.CalendarAttendeeCounts": {
7687
+ "type": "object",
7688
+ "required": [
7689
+ "accepted",
7690
+ "declined",
7691
+ "tentative",
7692
+ "needsAction"
7693
+ ],
7694
+ "properties": {
7695
+ "accepted": {
7696
+ "type": "integer",
7697
+ "format": "int32"
7698
+ },
7699
+ "declined": {
7700
+ "type": "integer",
7701
+ "format": "int32"
7702
+ },
7703
+ "tentative": {
7704
+ "type": "integer",
7705
+ "format": "int32"
7706
+ },
7707
+ "needsAction": {
7708
+ "type": "integer",
7709
+ "format": "int32"
7710
+ }
7711
+ },
7712
+ "description": "How many people on the guest list gave each answer, the organizer counted as a yes."
7713
+ },
7714
+ "RemitImap.CalendarAttendeeInput": {
7715
+ "type": "object",
7716
+ "required": [
7717
+ "email",
7718
+ "displayName"
7719
+ ],
7720
+ "properties": {
7721
+ "email": {
7722
+ "allOf": [
7723
+ {
7724
+ "$ref": "#/components/schemas/String512"
7725
+ }
7726
+ ],
7727
+ "description": "The guest's mail address"
7728
+ },
7729
+ "displayName": {
7730
+ "allOf": [
7731
+ {
7732
+ "$ref": "#/components/schemas/String512"
7733
+ }
7734
+ ],
7735
+ "description": "The guest's name. The address itself when the contact has none."
7736
+ }
7737
+ },
7738
+ "description": "A guest as the event editor sends one."
7739
+ },
7740
+ "RemitImap.CalendarAttendeeRole": {
7741
+ "type": "string",
7742
+ "enum": [
7743
+ "Organizer",
7744
+ "Guest"
7745
+ ],
7746
+ "description": "What one person on an event's guest list is to it."
7747
+ },
7748
+ "RemitImap.CalendarAttendeeStatus": {
7749
+ "type": "string",
7750
+ "enum": [
7751
+ "NeedsAction",
7752
+ "Accepted",
7753
+ "Tentative",
7754
+ "Declined"
7755
+ ],
7756
+ "description": "A guest's answer to an event, read from the ATTENDEE line's PARTSTAT (RFC 5545 3.2.12)."
7757
+ },
7119
7758
  "RemitImap.CalendarColor": {
7120
7759
  "type": "string",
7121
7760
  "enum": [
@@ -7131,9 +7770,25 @@
7131
7770
  "RemitImap.CalendarComponentSet": {
7132
7771
  "type": "string",
7133
7772
  "enum": [
7134
- "VeventOnly"
7773
+ "VeventOnly",
7774
+ "VtodoOnly"
7775
+ ],
7776
+ "description": "Which iCalendar components a collection accepts (RFC 4791 supported-calendar-component-set). The value is a property of the collection rather than of each object, so an event collection and a task collection are separate collections."
7777
+ },
7778
+ "RemitImap.CalendarEventDeleteResponse": {
7779
+ "type": "object",
7780
+ "required": [
7781
+ "sends"
7135
7782
  ],
7136
- "description": "Which iCalendar components a collection accepts (RFC 4791 supported-calendar-component-set). Only VEVENT is stored today; VTODO and VJOURNAL collections would be separate members, so the value is a property of the collection rather than of each object."
7783
+ "properties": {
7784
+ "sends": {
7785
+ "type": "array",
7786
+ "items": {
7787
+ "$ref": "#/components/schemas/RemitImap.CalendarSchedulingSend"
7788
+ }
7789
+ }
7790
+ },
7791
+ "description": "What deleting an event sent: one cancellation per guest when the reader organizes it, nothing otherwise."
7137
7792
  },
7138
7793
  "RemitImap.CalendarEventInstance": {
7139
7794
  "type": "object",
@@ -7150,7 +7805,8 @@
7150
7805
  "transparency",
7151
7806
  "zoneCertainty",
7152
7807
  "etag",
7153
- "hasRecurrence"
7808
+ "hasRecurrence",
7809
+ "participation"
7154
7810
  ],
7155
7811
  "properties": {
7156
7812
  "calendarId": {
@@ -7248,6 +7904,14 @@
7248
7904
  "hasRecurrence": {
7249
7905
  "type": "boolean",
7250
7906
  "description": "Whether the resource this occurrence came from expands to more than one instance. A client showing the recurrence-scope prompt gates on this."
7907
+ },
7908
+ "participation": {
7909
+ "allOf": [
7910
+ {
7911
+ "$ref": "#/components/schemas/RemitImap.CalendarParticipation"
7912
+ }
7913
+ ],
7914
+ "description": "Where the reader stands on this occurrence. Only the reader's own answer: the guest list is on `getCalendarEvent`."
7251
7915
  }
7252
7916
  },
7253
7917
  "description": "One occurrence of an event, in the window the caller asked for (issue #15).\n\nInstances are expanded by the server. A client never reads an RRULE and never\nreconstructs a series: it renders what this returns, and addresses one\noccurrence by `calendarObjectId` plus `recurrenceId`."
@@ -7288,7 +7952,12 @@
7288
7952
  "hasRecurrence",
7289
7953
  "expandedThrough",
7290
7954
  "createdAt",
7291
- "updatedAt"
7955
+ "updatedAt",
7956
+ "participation",
7957
+ "organizer",
7958
+ "attendees",
7959
+ "attendeeCounts",
7960
+ "sends"
7292
7961
  ],
7293
7962
  "properties": {
7294
7963
  "calendarObjectId": {
@@ -7443,9 +8112,42 @@
7443
8112
  "type": "integer",
7444
8113
  "format": "int64",
7445
8114
  "readOnly": true
8115
+ },
8116
+ "participation": {
8117
+ "allOf": [
8118
+ {
8119
+ "$ref": "#/components/schemas/RemitImap.CalendarParticipation"
8120
+ }
8121
+ ],
8122
+ "description": "Where the reader stands on the event's master"
8123
+ },
8124
+ "organizer": {
8125
+ "allOf": [
8126
+ {
8127
+ "$ref": "#/components/schemas/String512"
8128
+ }
8129
+ ],
8130
+ "description": "Mail address of the ORGANIZER, lower-cased. `\"\"` when the event names none."
8131
+ },
8132
+ "attendees": {
8133
+ "type": "array",
8134
+ "items": {
8135
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendee"
8136
+ },
8137
+ "description": "Everyone on the guest list, organizer first. Empty when the event has no guests."
8138
+ },
8139
+ "attendeeCounts": {
8140
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendeeCounts"
8141
+ },
8142
+ "sends": {
8143
+ "type": "array",
8144
+ "items": {
8145
+ "$ref": "#/components/schemas/RemitImap.CalendarSchedulingSend"
8146
+ },
8147
+ "description": "The scheduling messages about this event still in the outbox. A write answers with the ones it queued; a read with every one not yet sent and filed."
7446
8148
  }
7447
8149
  },
7448
- "description": "A stored calendar resource — the bytes behind one event, plus the columns projected from them. `icalData` is canonical; every other field is derived from it on write."
8150
+ "description": "A stored calendar resource — the bytes behind one event, plus the columns\nprojected from them. `icalData` is canonical; every other field is derived\nfrom it on write or on this read."
7449
8151
  },
7450
8152
  "RemitImap.CalendarEventStatus": {
7451
8153
  "type": "string",
@@ -7568,9 +8270,10 @@
7568
8270
  "type": "string",
7569
8271
  "enum": [
7570
8272
  "Accepted",
7571
- "Tentative"
8273
+ "Tentative",
8274
+ "Declined"
7572
8275
  ],
7573
- "description": "The answer an invitation is added to a calendar with. It is written as the user's `ATTENDEE;PARTSTAT` on the stored event (RFC 5545 3.2.12) and becomes the suggestion's state."
8276
+ "description": "The answer a guest gives an invitation. It is written as the reader's `ATTENDEE;PARTSTAT` on the stored event (RFC 5545 3.2.12)."
7574
8277
  },
7575
8278
  "RemitImap.CalendarInviteMethod": {
7576
8279
  "type": "string",
@@ -7599,6 +8302,18 @@
7599
8302
  },
7600
8303
  "description": "Every calendar collection of the caller's account config, url segment first. Unpaginated: an account holds a handful of calendars, and a page boundary in a sidebar is a bug waiting to happen."
7601
8304
  },
8305
+ "RemitImap.CalendarParticipation": {
8306
+ "type": "string",
8307
+ "enum": [
8308
+ "Unscheduled",
8309
+ "Organizer",
8310
+ "NeedsAction",
8311
+ "Accepted",
8312
+ "Tentative",
8313
+ "Declined"
8314
+ ],
8315
+ "description": "Where the reader stands on one occurrence, projected from its ORGANIZER and ATTENDEE lines against the addresses of the reader's own accounts."
8316
+ },
7602
8317
  "RemitImap.CalendarResponse": {
7603
8318
  "type": "object",
7604
8319
  "required": [
@@ -7729,28 +8444,62 @@
7729
8444
  "default": 0,
7730
8445
  "readOnly": true
7731
8446
  },
7732
- "subscriptionError": {
8447
+ "subscriptionError": {
8448
+ "allOf": [
8449
+ {
8450
+ "$ref": "#/components/schemas/String512"
8451
+ }
8452
+ ],
8453
+ "description": "Why the last fetch failed, or which events in it could not be stored. `\"\"` when the last fetch landed whole.",
8454
+ "default": "",
8455
+ "readOnly": true
8456
+ },
8457
+ "createdAt": {
8458
+ "type": "integer",
8459
+ "format": "int64",
8460
+ "readOnly": true
8461
+ },
8462
+ "updatedAt": {
8463
+ "type": "integer",
8464
+ "format": "int64",
8465
+ "readOnly": true
8466
+ }
8467
+ },
8468
+ "description": "A calendar collection as the API returns it."
8469
+ },
8470
+ "RemitImap.CalendarSchedulingSend": {
8471
+ "type": "object",
8472
+ "required": [
8473
+ "email",
8474
+ "outboxMessageId",
8475
+ "method",
8476
+ "status"
8477
+ ],
8478
+ "properties": {
8479
+ "email": {
8480
+ "allOf": [
8481
+ {
8482
+ "$ref": "#/components/schemas/String512"
8483
+ }
8484
+ ],
8485
+ "description": "The one address the message is to"
8486
+ },
8487
+ "outboxMessageId": {
8488
+ "$ref": "#/components/schemas/UUID"
8489
+ },
8490
+ "method": {
8491
+ "$ref": "#/components/schemas/RemitImap.CalendarInviteMethod"
8492
+ },
8493
+ "status": {
7733
8494
  "allOf": [
7734
8495
  {
7735
- "$ref": "#/components/schemas/String512"
8496
+ "$ref": "#/components/schemas/RemitImap.OutboxMessageStatus"
7736
8497
  }
7737
8498
  ],
7738
- "description": "Why the last fetch failed, or which events in it could not be stored. `\"\"` when the last fetch landed whole.",
7739
- "default": "",
7740
- "readOnly": true
7741
- },
7742
- "createdAt": {
7743
- "type": "integer",
7744
- "format": "int64",
7745
- "readOnly": true
7746
- },
7747
- "updatedAt": {
7748
- "type": "integer",
7749
- "format": "int64",
7750
- "readOnly": true
8499
+ "description": "Where the message stood when this response was built"
7751
8500
  }
7752
8501
  },
7753
- "description": "A calendar collection as the API returns it."
8502
+ "description": "One scheduling message an event write put in the outbox: an invitation, a cancellation or a reply. A client follows `outboxMessageId` to learn whether it went, and resends a failed one with `sendOutboxMessage`."
7754
8503
  },
7755
8504
  "RemitImap.CalendarSource": {
7756
8505
  "type": "string",
@@ -8002,6 +8751,151 @@
8002
8751
  ],
8003
8752
  "description": "What has become of a suggestion. `Pending` is the only state that asks a person for anything; every other value is a decision already taken, and nothing but an explicit act moves a suggestion out of `Pending`."
8004
8753
  },
8754
+ "RemitImap.CalendarTaskListResponse": {
8755
+ "type": "object",
8756
+ "required": [
8757
+ "items"
8758
+ ],
8759
+ "properties": {
8760
+ "items": {
8761
+ "type": "array",
8762
+ "items": {
8763
+ "$ref": "#/components/schemas/RemitImap.CalendarTaskResponse"
8764
+ }
8765
+ }
8766
+ },
8767
+ "description": "Tasks due in the requested window, in due order. Unpaginated: the window is the bound."
8768
+ },
8769
+ "RemitImap.CalendarTaskResponse": {
8770
+ "type": "object",
8771
+ "required": [
8772
+ "calendarTaskId",
8773
+ "calendarId",
8774
+ "resourceName",
8775
+ "icalUid",
8776
+ "icalData",
8777
+ "etag",
8778
+ "summary",
8779
+ "description",
8780
+ "due",
8781
+ "dueAt",
8782
+ "allDay",
8783
+ "completed",
8784
+ "createdAt",
8785
+ "updatedAt"
8786
+ ],
8787
+ "properties": {
8788
+ "calendarTaskId": {
8789
+ "allOf": [
8790
+ {
8791
+ "$ref": "#/components/schemas/UUID"
8792
+ }
8793
+ ],
8794
+ "description": "Primary identifier, derived from calendarId + resourceName",
8795
+ "readOnly": true
8796
+ },
8797
+ "calendarId": {
8798
+ "allOf": [
8799
+ {
8800
+ "$ref": "#/components/schemas/UUID"
8801
+ }
8802
+ ],
8803
+ "description": "Collection this task belongs to, a `VtodoOnly` one",
8804
+ "readOnly": true
8805
+ },
8806
+ "resourceName": {
8807
+ "allOf": [
8808
+ {
8809
+ "$ref": "#/components/schemas/String256"
8810
+ }
8811
+ ],
8812
+ "description": "Last path segment of the resource's URL, e.g. \"a1b2c3.ics\"",
8813
+ "readOnly": true
8814
+ },
8815
+ "icalUid": {
8816
+ "allOf": [
8817
+ {
8818
+ "$ref": "#/components/schemas/String512"
8819
+ }
8820
+ ],
8821
+ "description": "The VTODO's UID property",
8822
+ "readOnly": true
8823
+ },
8824
+ "icalData": {
8825
+ "type": "string",
8826
+ "description": "The complete VCALENDAR text — CANONICAL",
8827
+ "readOnly": true
8828
+ },
8829
+ "etag": {
8830
+ "allOf": [
8831
+ {
8832
+ "$ref": "#/components/schemas/String64"
8833
+ }
8834
+ ],
8835
+ "description": "Strong entity tag over the stored `icalData` bytes, for If-Match",
8836
+ "readOnly": true
8837
+ },
8838
+ "summary": {
8839
+ "allOf": [
8840
+ {
8841
+ "$ref": "#/components/schemas/String512"
8842
+ }
8843
+ ],
8844
+ "description": "Projection of the VTODO's SUMMARY. `\"\"` when it carries none.",
8845
+ "readOnly": true
8846
+ },
8847
+ "description": {
8848
+ "allOf": [
8849
+ {
8850
+ "$ref": "#/components/schemas/String2048"
8851
+ }
8852
+ ],
8853
+ "description": "Projection of the VTODO's DESCRIPTION. `\"\"` when it carries none.",
8854
+ "readOnly": true
8855
+ },
8856
+ "due": {
8857
+ "allOf": [
8858
+ {
8859
+ "$ref": "#/components/schemas/String64"
8860
+ }
8861
+ ],
8862
+ "description": "Projection of the VTODO's DUE as an ISO 8601 date-time with zone offset, read in the collection's timezone — a business date. An all-day task carries midnight of its civil date.",
8863
+ "readOnly": true
8864
+ },
8865
+ "dueAt": {
8866
+ "allOf": [
8867
+ {
8868
+ "$ref": "#/components/schemas/String64"
8869
+ }
8870
+ ],
8871
+ "description": "The same moment as `due`, as an ISO 8601 UTC instant, so `byDue` orders across zones.",
8872
+ "readOnly": true
8873
+ },
8874
+ "allDay": {
8875
+ "type": "boolean",
8876
+ "description": "Whether DUE is a DATE rather than a DATE-TIME: the task is due on a day, not at a time",
8877
+ "default": false,
8878
+ "readOnly": true
8879
+ },
8880
+ "completed": {
8881
+ "type": "boolean",
8882
+ "description": "Whether the VTODO is done: `STATUS:COMPLETED`",
8883
+ "default": false,
8884
+ "readOnly": true
8885
+ },
8886
+ "createdAt": {
8887
+ "type": "integer",
8888
+ "format": "int64",
8889
+ "readOnly": true
8890
+ },
8891
+ "updatedAt": {
8892
+ "type": "integer",
8893
+ "format": "int64",
8894
+ "readOnly": true
8895
+ }
8896
+ },
8897
+ "description": "A stored task, as the API returns it."
8898
+ },
8005
8899
  "RemitImap.CalendarTransparency": {
8006
8900
  "type": "string",
8007
8901
  "enum": [
@@ -8457,6 +9351,21 @@
8457
9351
  }
8458
9352
  ],
8459
9353
  "description": "RRULE value for a recurring event, e.g. \"FREQ=WEEKLY;BYDAY=MO\" (RFC 5545 3.8.5.3), without the property name. `\"\"` creates a single event. Refused with 400 when it is not a rule this server can read."
9354
+ },
9355
+ "attendees": {
9356
+ "type": "array",
9357
+ "items": {
9358
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendeeInput"
9359
+ },
9360
+ "description": "The guests. Each gets an invitation from the organizer's account, queued in the same write. Absent or empty creates an event nobody is invited to."
9361
+ },
9362
+ "organizerAccountId": {
9363
+ "allOf": [
9364
+ {
9365
+ "$ref": "#/components/schemas/UUID"
9366
+ }
9367
+ ],
9368
+ "description": "The account the event is organized and its invitations sent from. Refused with 400 `unknown_organizer` when it is not an account of the caller's account config, or `organizer_cannot_send` when that account has Mail turned off. Absent, an event with guests is sent from the default invitation sender in effect (`getUserSettings`)."
8460
9369
  }
8461
9370
  },
8462
9371
  "description": "Input for creating an event (issue #15). The server builds the VEVENT and\nwrites it through the single calendar write path, so an event created here,\none accepted from an invitation, and one PUT over CalDAV are the same bytes\nwritten the same way.\n\nTimes are ISO 8601 with zone offset — or a bare `YYYY-MM-DD` date when\n`allDay` is set. The offset pins the instant; `timeZone` names the zone the\nevent is anchored in, which is what a recurring event needs to survive a DST\ntransition. An offset alone cannot: a weekly 09:00 meeting written as\n`+02:00` becomes an 08:00 meeting in November."
@@ -8511,6 +9420,60 @@
8511
9420
  },
8512
9421
  "description": "Input for creating a calendar collection (issue #15).\n\n`urlSegment` is supplied rather than derived from the display name: it is the\ncollection's identity — `calendarId` is a hash of it — and the path a CalDAV\nclient will later bookmark. Slugging a name would make two calendars called\n\"Work\" one row, and a rename would either move a bookmarked path or leave a\nsegment that no longer matches anything a person recognises. The name is the\nmutable overlay; this is the address."
8513
9422
  },
9423
+ "RemitImap.CreateCalendarTaskInput": {
9424
+ "type": "object",
9425
+ "required": [
9426
+ "summary",
9427
+ "due"
9428
+ ],
9429
+ "properties": {
9430
+ "calendarId": {
9431
+ "allOf": [
9432
+ {
9433
+ "$ref": "#/components/schemas/UUID"
9434
+ }
9435
+ ],
9436
+ "description": "Collection to write the task into. Absent writes it into the account config's task collection. Refused with 400 when it names a collection that is not `VtodoOnly`."
9437
+ },
9438
+ "summary": {
9439
+ "allOf": [
9440
+ {
9441
+ "$ref": "#/components/schemas/String512"
9442
+ }
9443
+ ],
9444
+ "description": "SUMMARY of the task"
9445
+ },
9446
+ "description": {
9447
+ "allOf": [
9448
+ {
9449
+ "$ref": "#/components/schemas/String2048"
9450
+ }
9451
+ ],
9452
+ "description": "DESCRIPTION of the task. Absent writes none."
9453
+ },
9454
+ "due": {
9455
+ "allOf": [
9456
+ {
9457
+ "$ref": "#/components/schemas/String64"
9458
+ }
9459
+ ],
9460
+ "description": "When the task is due: an ISO 8601 date-time with zone offset, or a `YYYY-MM-DD` date when `allDay` is set."
9461
+ },
9462
+ "allDay": {
9463
+ "type": "boolean",
9464
+ "description": "Whether the task is due on a day rather than at a time"
9465
+ },
9466
+ "timeZone": {
9467
+ "allOf": [
9468
+ {
9469
+ "$ref": "#/components/schemas/String64"
9470
+ }
9471
+ ],
9472
+ "description": "IANA time zone the due time is anchored in. Absent anchors it in UTC."
9473
+ }
9474
+ },
9475
+ "description": "Input for creating a task. The server builds the VTODO."
9476
+ },
8514
9477
  "RemitImap.CreateExportResponse": {
8515
9478
  "type": "object",
8516
9479
  "required": [
@@ -12367,6 +13330,29 @@
12367
13330
  }
12368
13331
  ],
12369
13332
  "description": "RRULE value, or `\"\"` to drop the rule. Only meaningful with `scope=All` or `scope=Following`: an override is one occurrence and carries no rule of its own."
13333
+ },
13334
+ "attendees": {
13335
+ "type": "array",
13336
+ "items": {
13337
+ "$ref": "#/components/schemas/RemitImap.CalendarAttendeeInput"
13338
+ },
13339
+ "description": "The whole guest list after the edit. A new guest gets an invitation and a removed one a cancellation. Refused with 400 `not_organizer` on an event the reader does not organize."
13340
+ },
13341
+ "organizerAccountId": {
13342
+ "allOf": [
13343
+ {
13344
+ "$ref": "#/components/schemas/UUID"
13345
+ }
13346
+ ],
13347
+ "description": "The account that organizes the event, for an event that names no organizer yet. Refused with 400 `not_organizer` when the event already names a different one: the organizer never changes."
13348
+ },
13349
+ "answer": {
13350
+ "allOf": [
13351
+ {
13352
+ "$ref": "#/components/schemas/RemitImap.CalendarInviteAnswer"
13353
+ }
13354
+ ],
13355
+ "description": "The reader's answer as a guest. Writes their PARTSTAT and queues a REPLY to the organizer. `scope` `This` answers one occurrence and `All` the series; `Following` is refused with 400. Refused with 400 `not_a_guest` when the reader organizes the event or is not on its guest list."
12370
13356
  }
12371
13357
  },
12372
13358
  "description": "Input for updating an event. Every field is optional and absence means\nuntouched — a patch that carries only `summary` renames the event and moves\nnothing.\n\nWhat the patch applies to is the `scope` parameter's business: `All` rewrites\nthe master, `This` writes a RECURRENCE-ID override for one occurrence, and\n`Following` splits the series at one occurrence and applies the patch to the\nremainder."
@@ -12408,6 +13394,31 @@
12408
13394
  },
12409
13395
  "description": "Input for updating a calendar collection. The name, colour and timezone are the mutable overlay, and `subscriptionEnabled` turns a subscribed collection's refresh off and on. `urlSegment` is not among them, because it is the collection's identity and the path a client has bookmarked."
12410
13396
  },
13397
+ "RemitImap.UpdateCalendarTaskInput": {
13398
+ "type": "object",
13399
+ "properties": {
13400
+ "summary": {
13401
+ "$ref": "#/components/schemas/String512"
13402
+ },
13403
+ "description": {
13404
+ "$ref": "#/components/schemas/String2048"
13405
+ },
13406
+ "due": {
13407
+ "$ref": "#/components/schemas/String64"
13408
+ },
13409
+ "allDay": {
13410
+ "type": "boolean"
13411
+ },
13412
+ "timeZone": {
13413
+ "$ref": "#/components/schemas/String64"
13414
+ },
13415
+ "completed": {
13416
+ "type": "boolean",
13417
+ "description": "Marks the task done (`STATUS:COMPLETED`) or not done again (`STATUS:NEEDS-ACTION`)"
13418
+ }
13419
+ },
13420
+ "description": "Input for updating a task. Every field is optional and absence means untouched."
13421
+ },
12411
13422
  "RemitImap.UpdateFilterInput": {
12412
13423
  "type": "object",
12413
13424
  "properties": {
@@ -12608,6 +13619,41 @@
12608
13619
  },
12609
13620
  "description": "Input for updating a draft outbox message"
12610
13621
  },
13622
+ "RemitImap.UpdateUserSettingsInput": {
13623
+ "type": "object",
13624
+ "properties": {
13625
+ "defaultInvitationSenderAccountId": {
13626
+ "allOf": [
13627
+ {
13628
+ "$ref": "#/components/schemas/UUID"
13629
+ }
13630
+ ],
13631
+ "description": "The account invitations go out from by default. Refused with 400 `unknown_sender` when it is not an account of the caller's account config that sends mail. Cleared with `clearDefaultInvitationSender`."
13632
+ }
13633
+ },
13634
+ "description": "A change to the caller's settings. Every field is optional and absence means untouched."
13635
+ },
13636
+ "RemitImap.UserSettingsResponse": {
13637
+ "type": "object",
13638
+ "required": [
13639
+ "defaultInvitationSenderChosen"
13640
+ ],
13641
+ "properties": {
13642
+ "defaultInvitationSenderAccountId": {
13643
+ "allOf": [
13644
+ {
13645
+ "$ref": "#/components/schemas/UUID"
13646
+ }
13647
+ ],
13648
+ "description": "The account calendar invitations, updates and cancellations go out from unless the event editor picks another: the one the reader chose while it still sends mail, otherwise the account an event is on — for a new event, the first account of the account config that sends mail, since a calendar belongs to the account config rather than to one account. Absent only when no account sends mail."
13649
+ },
13650
+ "defaultInvitationSenderChosen": {
13651
+ "type": "boolean",
13652
+ "description": "Whether `defaultInvitationSenderAccountId` is the reader's own choice rather than the account an event is on."
13653
+ }
13654
+ },
13655
+ "description": "The caller's own settings: choices that belong to the person rather than to\none mail account. Each field is stored as an `AccountSetting` row of the\naccount config and read back here, so a setting added later is one more\nfield on this resource rather than one more operation."
13656
+ },
12611
13657
  "RemitImap.VipFlag": {
12612
13658
  "type": "object",
12613
13659
  "required": [