Commit Graph

54 Commits

Author SHA1 Message Date
Pascal Bleser 5d5dd031b9 API documentation changes for groupware-apidocs
* add example generator infrastructure, with some examples for pkg/jmap
   and pkg/groupware, with more needing to be done

 * alter the apidoc Makefile to stop using go-swagger but, instead, use
   the openapi.yml file that must be dropped into that directory using
   groupware-apidocs (will improve the integration there later)

 * add Makefile target to generate examples

 * bump redocly from 2.4.0 to 2.14.5

 * introduce Request.PathParam() and .PathParamDoc() to improve API
   documentation, as well as future-proofing

 * improve X-Request-ID and Trace-Id header handling in the middleware
   by logging it safely when an error occurs in the middleware
2026-01-22 09:42:24 +01:00
Pascal Bleser 1e6c97cefe groupware: improve email submission and testing
* jmap/EmailCreate: add more attributes that were omitted: Headers,
   InReplyTo, References, Sender

 * add jmap GetEmailSubmissionStatus

 * improve email integration tests by adding a thorough test for email
   submission

 * jmap integration tests: provision principals and domains using the
   Stalwart Management API, switching from an in-memory to an internal
   directory
2026-01-22 09:42:24 +01:00
Pascal Bleser 0b2bfb8b4f groupware: add retrieving and adding mailboxIds for drafts and sent if they are missing 2026-01-22 09:42:24 +01:00
Pascal Bleser b5d3819455 groupware: WS push improvements, add getting email changes to WS integration test 2026-01-22 09:42:24 +01:00
Pascal Bleser 349bd20d57 groupware: JMAP WS push notifications support 2026-01-22 09:42:24 +01:00
Pascal Bleser 6cf7ed88cb groupware: fix email summaries and allow negative offsets
* fix a bug in how email summaries are flattened across multiple
   accounts, which was previous resulting in empty email objects

 * allow negative offset in email pagination

 * make all /emails endpoints return emails without bodies
2026-01-22 09:42:24 +01:00
Pascal Bleser deee89d683 groupware: finalize JMAP events integration test, with multiple changes to the model to conform with draft-ietf-calext-jscalendarbis-10 and fields that are currently not implemented in Stalwart 2026-01-22 09:42:24 +01:00
Pascal Bleser e75c64b781 groupware: fix recently introduced error with UploadedBlob with and without a sha512 2026-01-22 09:42:24 +01:00
Pascal Bleser c1de965871 groupware: add getting a contact by ID + add integration tests for contacts 2026-01-22 09:42:24 +01:00
Pascal Bleser 476b82d527 groupware: improved integration test for email, fixed two bugs 2026-01-22 09:42:24 +01:00
Pascal Bleser 9a7b66e129 groupware: add real calendars and events 2026-01-22 09:42:24 +01:00
Pascal Bleser a3033e48cd groupware: implement/fix email submission 2026-01-22 09:42:24 +01:00
Pascal Bleser 16a3168588 groupware: implement Mailbox modification endpoints + refactor ETag/state in the framework
* add endpoints for Mailboxes:
   - PATCH mailboxes/{id}
   - DELETE mailboxes/{id}
   - POST mailboxes

 * refactor the pkg/jmap and groupware framework to systematically
   return a jmap.State out-of-band of the per-method payloads, since
   they are almost always present in JMAP responses, which lead to the
   artificial creation of a lot of composed struct types just to also
   return the State; on the downside, it adds yet another return
   parameter
2026-01-22 09:42:24 +01:00
Pascal Bleser f4420505bb groupware: add ical blob parsing endpoint 2026-01-22 09:42:24 +01:00
Pascal Bleser 127540bb2b groupware: actually add total and limit to the email summary endpoint 2026-01-22 09:42:24 +01:00
Pascal Bleser 81cec702f3 groupware: add ContactCard operations 2026-01-22 09:42:24 +01:00
Pascal Bleser 5ae69edded groupware: add threadSize in email-by-id response 2026-01-22 09:42:23 +01:00
Pascal Bleser 6d434e245e groupware: introduce constants for Email property names, see EmailSummaryProperties 2026-01-22 09:42:23 +01:00
Pascal Bleser 438e35a089 groupware: fix keyword patching syntax for markAsSeen=true 2026-01-22 09:42:23 +01:00
Pascal Bleser c230888d8a groupware: add threadSize property in the email summary endpoint 2026-01-22 09:42:23 +01:00
Pascal Bleser 90e8470fbb groupware:
* made several email related operations multi-account:
   QueryEmailSnippets, QueryEmails, QueryEmailsWithSnippets

 * add GetIdentitiesForAllAccounts

 * add GetEmailsForAllAccounts

 * jmap: add CreateIdentity, UpdateIdentity; groupware: add
   GetIdentityById, AddIdentity, ModifyIdentity

 * add temporary workaround until Calendars, Tasks, Contacts are
   implemented in Stalwart when determining the default account for
   those: use the mail one in the mean time
2026-01-22 09:42:23 +01:00
Pascal Bleser b74058dbbf jmap: fix Email/set 2026-01-22 09:42:23 +01:00
Pascal Bleser deee6102ec groupware: add quota API + add support for Accept-Language and Content-Language 2026-01-22 09:42:22 +01:00
Pascal Bleser 5dc89de7ef groupware: add JMAP capability checking (in part: for contacts, calendars, tasks) 2026-01-22 09:42:22 +01:00
Pascal Bleser d6e269abb8 groupware: add mock endpoints for tasklists and tasks 2026-01-22 09:42:22 +01:00
Pascal Bleser 55d521d15d groupware: implement JMAP Task specification 2026-01-22 09:42:22 +01:00
Pascal Bleser 5df0ec0e25 groupware: more mock data, added missing JMAP types 2026-01-22 09:42:22 +01:00
Pascal Bleser d9878b38eb groupware: add mock endpoints for addressbooks and contacts 2026-01-22 09:42:22 +01:00
Pascal Bleser e754b5a718 Implement JSContact (RFC9553) Model
* add pkg/jscontact with the implementation of the RFC9553 data model

 * add JMAP Calendar session capabilities support in pkg/jmap
2026-01-22 09:42:22 +01:00
Pascal Bleser 6db8dd3956 start websocket implementation, add endpoint for email summaries
* feat(groupware): start implementing JMAP websocket support for push
   notifications (unfinished)

 * groupware: add GetLatestEmailsSummaryForAllAccounts

 * add new vendored dependency: github.com/gorilla/websocket

 * jmap: add QueryEmailSummaries

 * openapi: start adding examples

 * openapi: add new tooling for api-examples.yaml injection

 * apidoc-process.ts: make it more typescript-y

 * bump @redocly/cli from 2.0.8 to latest 2.2.0
2026-01-22 09:42:22 +01:00
Pascal Bleser c7c5dca112 jmap: modify GetBlob -> GetBlobMetadata
* fix(jmap): fix bug where CommandBlobUpload was used instead of
   CommandBlobGet in GetBlob (now GetBlobMetadata)

 * we currently don't need a variant of BlobGetCommand that also
   retrieves the content of the blob, instead we only use it for
   retrieving metadata about it
2026-01-22 09:42:22 +01:00
Pascal Bleser 299a356076 fix(groupware): fix JMAP error handling
* the JMAP error handling was not working properly, fixed it and added
   error definitions accordingly

 * add operations to retrieve mailbox roles and mailboxes by role for
   all accounts
2026-01-22 09:42:22 +01:00
Pascal Bleser b0768ae4b5 refactor(groupware): add max requests check
* move jmap.request() to jmap.Client.request() and pass the Session
   and a Logger to introduce checking the number of methodCalls within a
   request not exceeding the limit of the Session, as well as error
   handling and logging there instead of in each caller

 * a few bugfixes:
   - add a few missing Send() calls in logs
   - correct the response tag matching for
     GetMailboxChangesForMultipleAccounts
   - fix typo in Identity.ReplyTo json serialization rune
   - fix response tag in pkg/jmap/testdata/mailboxes1.json after
     changing them to be prefixed by the accountId
2026-01-22 09:42:22 +01:00
Pascal Bleser a7563532a1 groupware: minor typo fixes 2026-01-22 09:42:22 +01:00
Pascal Bleser 6af523c290 groupware: jmap: add metrics 2026-01-22 09:39:16 +01:00
Pascal Bleser d5f75ad8e0 groupware: Etag handling
* implement correct Etag and If-None-Match handling, responding with
   304 Not Modified if they match

 * introduce SessionState and State string type aliases to ensure we are
   using the correct fields for those, respectively

 * extract the SessionState from the JMAP response bodies in the
   groupware framework instead of having to do that in every single
   groupware API

 * use uint instead of int in some places to clarify that the values are
   >= 0

 * trace-log how long a Session was held in cache before being evicted

 * add Trace-Id header handling: add to response when specified in
   request, and implement a custom request logger to include it as a
   field

 * implement a more compact trace-logging of all the methods and URIs
   that are served, to put them into a single log entry instead of
   creating one log entry for every URI
2026-01-22 09:39:16 +01:00
Pascal Bleser eab949ba68 groupware: initial related emails implementation with SSE 2026-01-22 09:39:16 +01:00
Pascal Bleser 146558eea9 groupware: swagger API documentation improvements
* add more documentation for properties

 * fixes after a bit of trial-and-error with go-swagger

 * fix email filter marshalling when there are no search criteria

 * introduce an apidoc.yml that contains Swagger data and is merged when
   generating the swagger.yml from sources
2026-01-22 09:39:16 +01:00
Pascal Bleser 7a1ee6e19b Groupware improvements
* ensure that all the jmap responses contain the SessionState

 * implement missing errors that were marked as TODO

 * moved common functions from pkg/jmap and pkg/services/groupware to
   pkg/log and pkg/structs to commonalize them across both source trees

 * implement error handling for SetError occurences

 * Email: replace anonymous map[string]bool for mailbox rights with a
   MailboxRights struct, as the keys are well-defined, which allows for
   properly documenting them

 * introduce ObjectType as an "enum"

 * fix JSON marshalling and unmarshalling of EmailBodyStructure

 * move the swagger documentation structs from groupware_api.go to
   groupware_docs.go

 * fix: change verb for /groupware/accounts/*/vacation from POST to PUT
2026-01-22 09:39:16 +01:00
Pascal Bleser f308b61490 groupware: minor email searching response improvements + started implementing vacation response setting API 2026-01-22 09:39:16 +01:00
Pascal Bleser 4522ac8e89 groupware: add identities of all accounts to the index resource 2026-01-22 09:39:16 +01:00
Pascal Bleser 58ece4581b groupware: fix email search, add variant that includes the full emails 2026-01-22 09:39:16 +01:00
Pascal Bleser 73e2efb458 Groupware: refactor jmap package, implement Email/set, EmailSubmission
* refactor the jmap package to split it into several files as the
   jmap.api.go file was becoming too unwieldy

 * refactor the Groupware handler function response to be a Response
   object, to be more future-proof and avoid adding more and more
   return parameters while handling "no content" response as well

 * more godoc for the JMAP model

 * add Email creation, updating, deleting (Email/set,
   EmailSubmission/set)

 * add endpoints
   - POST /accounts/{accountid}/messages
   - PATCH|PUT /accounts/{accountid}/messages/{messageid}
   - DELETE /accounts/{accountid}/messages/{messageid}
2026-01-22 09:39:15 +01:00
Pascal Bleser 67803b435a groupware: implement message search with snippets 2026-01-22 09:39:15 +01:00
Pascal Bleser 5c561dfdf1 groupware: blob streaming (upload and download) 2026-01-22 09:39:15 +01:00
Pascal Bleser 5d14c966d5 groupware: more JMAP operations implementation 2026-01-22 09:39:15 +01:00
Pascal Bleser 4dcbb5d8e3 groupware: further implementation and improvements 2026-01-22 09:39:15 +01:00
Pascal Bleser 6f593d1bd8 refactored the Session object, refactored the services/groupware directory, and started Swagger documentation implementation 2026-01-22 09:39:15 +01:00
Pascal Bleser 80b31a8574 groupware: implement JSON:API's error response format, with a revamped error handling in jmap and services/groupware 2026-01-22 09:39:15 +01:00
Pascal Bleser 0247c28d58 Refactor groupware service after ADR decision on the Groupware API
* after having decided that the Groupware API should be a standalone
   independent custom REST API that is using JMAP data models as much as
   possible,
 * removed Groupware APIs from the Graph service
 * moved Groupware implementation to the Groupware service, and
   refactored a few things accordingly
2026-01-22 09:39:15 +01:00