mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-06-17 12:28:57 -04:00
* refactor APIs in JMAP and Groupware in order to implement pagination across multiple accountIds and multiple suppliers (currently implemented using a mock supplier for contacts) * requires go 1.26 due to use of self-reflecting generics type constraints * still missing: query criteria and sorting parameters * still missing: multi-accountId support for emails * errors are now all just 'error' in the APIs, instead of the specialized implementations, and are interpreted dynamically where necessary in order to transform them into HTTP responses * remove position, anchor, anchorOffset as individual query parameters as we now only support a 'next=...' token for subsequent pages (except in emails for now), and use jmap.QueryParams instead; those tokens have a header character for the format, followed by a JSON encoded QueryParams map, all wrapped into base62 to make it clearer that it is meant to be an opaque token, and not a parameter clients should tinker with or construct themselves * introduce QueryParamsSupplier as an interface to provide QueryParams for various scenarios (single supplier, multiple supplier, ...) per accountId * implement multi-supplier template methods slist and squery
76 lines
2.4 KiB
Go
76 lines
2.4 KiB
Go
package jmap
|
|
|
|
import (
|
|
"github.com/opencloud-eu/opencloud/pkg/structs"
|
|
)
|
|
|
|
type AccountBootstrapResult struct {
|
|
Identities []Identity `json:"identities,omitempty"`
|
|
Quotas []Quota `json:"quotas,omitempty"`
|
|
}
|
|
|
|
var NS_MAIL_QUOTA = ns(JmapMail, JmapQuota)
|
|
|
|
func (j *Client) GetBootstrap(accountIds []string, ctx Context) (Result[map[string]AccountBootstrapResult], error) { //NOSONAR
|
|
uniqueAccountIds := structs.Uniq(accountIds)
|
|
|
|
logger := j.logger("GetBootstrap", ctx)
|
|
ctx = ctx.WithLogger(logger)
|
|
|
|
calls := make([]Invocation, len(uniqueAccountIds)*2)
|
|
for i, accountId := range uniqueAccountIds {
|
|
calls[i*2+0] = invocation(IdentityGetCommand{AccountId: accountId}, mcid(accountId, "I"))
|
|
calls[i*2+1] = invocation(QuotaGetCommand{AccountId: accountId}, mcid(accountId, "Q"))
|
|
}
|
|
|
|
cmd, err := j.request(ctx, NS_MAIL_QUOTA, calls...)
|
|
if err != nil {
|
|
return ZeroResult[map[string]AccountBootstrapResult](), err
|
|
}
|
|
return command(j, ctx, cmd, func(body *Response) (map[string]AccountBootstrapResult, State, Error) {
|
|
identityPerAccount := map[string][]Identity{}
|
|
quotaPerAccount := map[string][]Quota{}
|
|
identityStatesPerAccount := map[string]State{}
|
|
quotaStatesPerAccount := map[string]State{}
|
|
for _, accountId := range uniqueAccountIds {
|
|
var identityResponse IdentityGetResponse
|
|
err = retrieveResponseMatchParameters(ctx, body, CommandIdentityGet, mcid(accountId, "I"), &identityResponse)
|
|
if err != nil {
|
|
return nil, "", err
|
|
} else {
|
|
identityPerAccount[accountId] = identityResponse.List
|
|
identityStatesPerAccount[accountId] = identityResponse.State
|
|
}
|
|
|
|
var quotaResponse QuotaGetResponse
|
|
err = retrieveResponseMatchParameters(ctx, body, CommandQuotaGet, mcid(accountId, "Q"), "aResponse)
|
|
if err != nil {
|
|
return nil, "", err
|
|
} else {
|
|
quotaPerAccount[accountId] = quotaResponse.List
|
|
quotaStatesPerAccount[accountId] = quotaResponse.State
|
|
}
|
|
}
|
|
|
|
result := map[string]AccountBootstrapResult{}
|
|
for accountId, value := range identityPerAccount {
|
|
r, ok := result[accountId]
|
|
if !ok {
|
|
r = AccountBootstrapResult{}
|
|
}
|
|
r.Identities = value
|
|
result[accountId] = r
|
|
}
|
|
for accountId, value := range quotaPerAccount {
|
|
r, ok := result[accountId]
|
|
if !ok {
|
|
r = AccountBootstrapResult{}
|
|
}
|
|
r.Quotas = value
|
|
result[accountId] = r
|
|
}
|
|
|
|
return result, squashStateMaps(identityStatesPerAccount, quotaStatesPerAccount), nil
|
|
})
|
|
}
|