Split each API's monolithic schema.graphql into per-coredata-model
files under graphql/ subdirectories. gqlgen's follow-schema layout
with {name}.resolvers.go template generates one resolver file per
schema file. Relay uses schema + schemaExtensions to load the split
files.
Connect API: 8 files (base, session, organization, profile,
personal_api_key, saml, scim, audit_log)
Trust API: 5 files (base, trust_center, auth, nda, mailing_list)
Console API: 25 files covering all domain entities
Types extended across files (Organization, Mutation, Viewer,
TrustCenter, Identity) are defined in base.graphql as required by
Relay's schemaExtensions.
Signed-off-by: Émile Ré <emile@getprobo.com>
288 lines
11 KiB
Go
288 lines
11 KiB
Go
package console_v1
|
|
|
|
// This file will be automatically regenerated based on the schema, any resolver
|
|
// implementations
|
|
// will be copied through when generating and any unknown code will be moved to the end.
|
|
// Code generated by github.com/99designs/gqlgen version v0.17.87
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"go.gearno.de/kit/log"
|
|
"go.probo.inc/probo/pkg/coredata"
|
|
"go.probo.inc/probo/pkg/mailman"
|
|
"go.probo.inc/probo/pkg/page"
|
|
"go.probo.inc/probo/pkg/probo"
|
|
"go.probo.inc/probo/pkg/server/api/console/v1/schema"
|
|
"go.probo.inc/probo/pkg/server/api/console/v1/types"
|
|
"go.probo.inc/probo/pkg/server/gqlutils"
|
|
"go.probo.inc/probo/pkg/validator"
|
|
)
|
|
|
|
// Subscribers is the resolver for the subscribers field on MailingList.
|
|
func (r *mailingListResolver) Subscribers(ctx context.Context, obj *types.MailingList, first *int, after *page.CursorKey, last *int, before *page.CursorKey) (*types.MailingListSubscriberConnection, error) {
|
|
if err := r.authorize(ctx, obj.ID, probo.ActionMailingListSubscriberList); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
pageOrderBy := page.OrderBy[coredata.MailingListSubscriberOrderField]{
|
|
Field: coredata.MailingListSubscriberOrderFieldCreatedAt,
|
|
Direction: page.OrderDirectionDesc,
|
|
}
|
|
|
|
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
|
|
|
result, err := r.mailman.ListSubscribers(ctx, obj.ID, cursor)
|
|
if err != nil {
|
|
r.logger.ErrorCtx(ctx, "cannot list mailing list subscribers", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return types.NewMailingListSubscriberConnection(result, r, obj.ID), nil
|
|
}
|
|
|
|
// Updates is the resolver for the updates field on MailingList.
|
|
func (r *mailingListResolver) Updates(ctx context.Context, obj *types.MailingList, first *int, after *page.CursorKey, last *int, before *page.CursorKey) (*types.MailingListUpdateConnection, error) {
|
|
if err := r.authorize(ctx, obj.ID, probo.ActionMailingListUpdateList); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
pageOrderBy := page.OrderBy[coredata.MailingListUpdateOrderField]{
|
|
Field: coredata.MailingListUpdateOrderFieldUpdatedAt,
|
|
Direction: page.OrderDirectionDesc,
|
|
}
|
|
|
|
cursor := types.NewCursor(first, after, last, before, pageOrderBy)
|
|
|
|
result, err := r.mailman.ListMailingListUpdates(ctx, obj.ID, cursor)
|
|
if err != nil {
|
|
r.logger.ErrorCtx(ctx, "cannot list mailing list updates", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return types.NewMailingListUpdateConnection(result, r, obj.ID), nil
|
|
}
|
|
|
|
// TotalCount is the resolver for the totalCount field.
|
|
func (r *mailingListSubscriberConnectionResolver) TotalCount(ctx context.Context, obj *types.MailingListSubscriberConnection) (int, error) {
|
|
if err := r.authorize(ctx, obj.ParentID, probo.ActionMailingListSubscriberList); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
switch obj.Resolver.(type) {
|
|
case *mailingListResolver:
|
|
count, err := r.mailman.CountSubscribers(ctx, obj.ParentID)
|
|
if err != nil {
|
|
r.logger.ErrorCtx(ctx, "cannot count mailing list subscribers", log.Error(err))
|
|
return 0, gqlutils.Internal(ctx)
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
r.logger.ErrorCtx(ctx, "unsupported resolver for mailing list subscriber connection", log.String("resolver", fmt.Sprintf("%T", obj.Resolver)))
|
|
return 0, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
// TotalCount is the resolver for the totalCount field on MailingListUpdateConnection.
|
|
func (r *mailingListUpdateConnectionResolver) TotalCount(ctx context.Context, obj *types.MailingListUpdateConnection) (int, error) {
|
|
if err := r.authorize(ctx, obj.ParentID, probo.ActionMailingListUpdateList); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
count, err := r.mailman.CountMailingListUpdates(ctx, obj.ParentID)
|
|
if err != nil {
|
|
r.logger.ErrorCtx(ctx, "cannot count mailing list updates", log.Error(err))
|
|
return 0, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return count, nil
|
|
}
|
|
|
|
// CreateMailingListUpdate is the resolver for the createMailingListUpdate field.
|
|
func (r *mutationResolver) CreateMailingListUpdate(ctx context.Context, input types.CreateMailingListUpdateInput) (*types.CreateMailingListUpdatePayload, error) {
|
|
if err := r.authorize(ctx, input.MailingListID, probo.ActionMailingListUpdateCreate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
mlu, err := r.mailman.CreateMailingListUpdate(
|
|
ctx,
|
|
&mailman.CreateMailingListUpdateRequest{
|
|
MailingListID: input.MailingListID,
|
|
Title: input.Title,
|
|
Body: input.Body,
|
|
},
|
|
)
|
|
if err != nil {
|
|
if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok {
|
|
return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors)
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot create mailing list update", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.CreateMailingListUpdatePayload{
|
|
MailingListUpdate: types.NewMailingListUpdate(mlu),
|
|
}, nil
|
|
}
|
|
|
|
// UpdateMailingListUpdate is the resolver for the updateMailingListUpdate field.
|
|
func (r *mutationResolver) UpdateMailingListUpdate(ctx context.Context, input types.UpdateMailingListUpdateInput) (*types.UpdateMailingListUpdatePayload, error) {
|
|
if err := r.authorize(ctx, input.ID, probo.ActionMailingListUpdateUpdate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
mlu, err := r.mailman.UpdateMailingListUpdate(
|
|
ctx,
|
|
&mailman.UpdateMailingListUpdateRequest{
|
|
ID: input.ID,
|
|
Title: input.Title,
|
|
Body: input.Body,
|
|
},
|
|
)
|
|
if err != nil {
|
|
if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok {
|
|
return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors)
|
|
}
|
|
if errors.Is(err, mailman.ErrMailingListUpdateAlreadySent) {
|
|
return nil, gqlutils.Conflictf(ctx, "mailing list update can only be edited when in draft")
|
|
}
|
|
if errors.Is(err, mailman.ErrMailingListUpdateNotFound) {
|
|
return nil, gqlutils.NotFoundf(ctx, "mailing list update not found")
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot update mailing list update", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.UpdateMailingListUpdatePayload{
|
|
MailingListUpdate: types.NewMailingListUpdate(mlu),
|
|
}, nil
|
|
}
|
|
|
|
// SendMailingListUpdate is the resolver for the sendMailingListUpdate field.
|
|
func (r *mutationResolver) SendMailingListUpdate(ctx context.Context, input types.SendMailingListUpdateInput) (*types.SendMailingListUpdatePayload, error) {
|
|
if err := r.authorize(ctx, input.ID, probo.ActionMailingListUpdateUpdate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
mlu, err := r.mailman.SendMailingListUpdate(ctx, input.ID)
|
|
if err != nil {
|
|
if errors.Is(err, mailman.ErrMailingListUpdateAlreadySent) {
|
|
return nil, gqlutils.Conflictf(ctx, "mailing list update has already been queued for sending")
|
|
}
|
|
if errors.Is(err, mailman.ErrMailingListUpdateNotFound) {
|
|
return nil, gqlutils.NotFoundf(ctx, "mailing list update not found")
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot queue mailing list update for sending", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.SendMailingListUpdatePayload{
|
|
MailingListUpdate: types.NewMailingListUpdate(mlu),
|
|
}, nil
|
|
}
|
|
|
|
// DeleteMailingListUpdate is the resolver for the deleteMailingListUpdate field.
|
|
func (r *mutationResolver) DeleteMailingListUpdate(ctx context.Context, input types.DeleteMailingListUpdateInput) (*types.DeleteMailingListUpdatePayload, error) {
|
|
if err := r.authorize(ctx, input.ID, probo.ActionMailingListUpdateDelete); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := r.mailman.DeleteMailingListUpdate(ctx, input.ID); err != nil {
|
|
if errors.Is(err, mailman.ErrMailingListUpdateNotFound) {
|
|
return nil, gqlutils.NotFoundf(ctx, "mailing list update not found")
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot delete mailing list update", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.DeleteMailingListUpdatePayload{
|
|
DeletedMailingListUpdateID: input.ID,
|
|
}, nil
|
|
}
|
|
|
|
// UpdateMailingList is the resolver for the updateMailingList field.
|
|
func (r *mutationResolver) UpdateMailingList(ctx context.Context, input types.UpdateMailingListInput) (*types.UpdateMailingListPayload, error) {
|
|
if err := r.authorize(ctx, input.ID, probo.ActionMailingListUpdate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ml, err := r.mailman.UpdateMailingList(ctx, input.ID, input.ReplyTo)
|
|
if err != nil {
|
|
r.logger.ErrorCtx(ctx, "cannot update mailing list", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.UpdateMailingListPayload{
|
|
MailingList: types.NewMailingList(ml),
|
|
}, nil
|
|
}
|
|
|
|
// CreateMailingListSubscriber is the resolver for the createMailingListSubscriber field.
|
|
func (r *mutationResolver) CreateMailingListSubscriber(ctx context.Context, input types.CreateMailingListSubscriberInput) (*types.CreateMailingListSubscriberPayload, error) {
|
|
if err := r.authorize(ctx, input.MailingListID, probo.ActionMailingListSubscriberCreate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
subscriber, err := r.mailman.CreateSubscriber(
|
|
ctx,
|
|
&mailman.CreateSubscriberRequest{
|
|
MailingListID: input.MailingListID,
|
|
Email: input.Email,
|
|
FullName: input.FullName,
|
|
Confirmed: input.Confirmed != nil && *input.Confirmed,
|
|
},
|
|
)
|
|
if err != nil {
|
|
if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok {
|
|
return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors)
|
|
}
|
|
if errors.Is(err, mailman.ErrSubscriberAlreadyExist) {
|
|
return nil, gqlutils.Conflictf(ctx, "subscriber already exists in this mailing list")
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot create mailing list subscriber", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.CreateMailingListSubscriberPayload{
|
|
MailingListSubscriberEdge: types.NewMailingListSubscriberEdge(subscriber, coredata.MailingListSubscriberOrderFieldCreatedAt),
|
|
}, nil
|
|
}
|
|
|
|
// DeleteMailingListSubscriber is the resolver for the deleteMailingListSubscriber field.
|
|
func (r *mutationResolver) DeleteMailingListSubscriber(ctx context.Context, input types.DeleteMailingListSubscriberInput) (*types.DeleteMailingListSubscriberPayload, error) {
|
|
if err := r.authorize(ctx, input.ID, probo.ActionMailingListSubscriberDelete); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := r.mailman.DeleteSubscriber(ctx, input.ID); err != nil {
|
|
if errors.Is(err, mailman.ErrSubscriberNotFound) {
|
|
return nil, gqlutils.NotFoundf(ctx, "mailing list subscriber not found")
|
|
}
|
|
r.logger.ErrorCtx(ctx, "cannot delete mailing list subscriber", log.Error(err))
|
|
return nil, gqlutils.Internal(ctx)
|
|
}
|
|
|
|
return &types.DeleteMailingListSubscriberPayload{
|
|
DeletedMailingListSubscriberID: input.ID,
|
|
}, nil
|
|
}
|
|
|
|
// MailingList returns schema.MailingListResolver implementation.
|
|
func (r *Resolver) MailingList() schema.MailingListResolver { return &mailingListResolver{r} }
|
|
|
|
// MailingListSubscriberConnection returns schema.MailingListSubscriberConnectionResolver implementation.
|
|
func (r *Resolver) MailingListSubscriberConnection() schema.MailingListSubscriberConnectionResolver {
|
|
return &mailingListSubscriberConnectionResolver{r}
|
|
}
|
|
|
|
// MailingListUpdateConnection returns schema.MailingListUpdateConnectionResolver implementation.
|
|
func (r *Resolver) MailingListUpdateConnection() schema.MailingListUpdateConnectionResolver {
|
|
return &mailingListUpdateConnectionResolver{r}
|
|
}
|
|
|
|
type mailingListResolver struct{ *Resolver }
|
|
type mailingListSubscriberConnectionResolver struct{ *Resolver }
|
|
type mailingListUpdateConnectionResolver struct{ *Resolver }
|