From f8fd49a9a945d85e8c5cc063261f2b3c4343a68e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 1 Mar 2023 16:54:32 +0100 Subject: [PATCH] invitation implementation outline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- services/invitations/pkg/service/v0/errors.go | 6 +- .../invitations/pkg/service/v0/service.go | 69 ++++++++++++++++++- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/services/invitations/pkg/service/v0/errors.go b/services/invitations/pkg/service/v0/errors.go index b71ec4ca7..7f34c4edb 100644 --- a/services/invitations/pkg/service/v0/errors.go +++ b/services/invitations/pkg/service/v0/errors.go @@ -2,4 +2,8 @@ package service import "errors" -var ErrNotFound = errors.New("query target not found") +var ( + ErrNotFound = errors.New("query target not found") + ErrBadRequest = errors.New("bad request") + ErrMissingEmail = errors.New("missing email address") +) diff --git a/services/invitations/pkg/service/v0/service.go b/services/invitations/pkg/service/v0/service.go index aa5fd0785..b72194c88 100644 --- a/services/invitations/pkg/service/v0/service.go +++ b/services/invitations/pkg/service/v0/service.go @@ -1,8 +1,13 @@ package service import ( + "bytes" "context" + "crypto/tls" + "encoding/json" + "net/http" + libregraph "github.com/owncloud/libre-graph-api-go" "github.com/owncloud/ocis/v2/ocis-pkg/log" "github.com/owncloud/ocis/v2/services/invitations/pkg/config" "github.com/owncloud/ocis/v2/services/invitations/pkg/invitations" @@ -49,7 +54,65 @@ type svc struct { // Invite implements the service interface func (s svc) Invite(ctx context.Context, invitation *invitations.Invitation) (*invitations.Invitation, error) { - return &invitations.Invitation{ - InvitedUserDisplayName: "Yay", - }, nil + + if invitation == nil { + return nil, ErrBadRequest + } + + if invitation.InvitedUserEmailAddress == "" { + return nil, ErrMissingEmail + } + + user := &libregraph.User{ + Mail: &invitation.InvitedUserEmailAddress, + // TODO we cannot set the user type here + } + + if invitation.InvitedUserDisplayName != "" { + user.DisplayName = &invitation.InvitedUserDisplayName + } + // we don't really need a username as guests have to log in with their email address anyway + // what if later a user is provisioned with a guest accounts email address? + + data, err := json.Marshal(user) + if err != nil { + return nil, err + } + + // send a request to the provisioning endpoint + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true /*TODO make configurable*/}, + } + client := &http.Client{Transport: tr} + + req, err := http.NewRequest("POST", "/graph/v1.0/users", bytes.NewReader(data)) + if err != nil { + return nil, err + } + + // TODO either forward current user token or use bearer token? + req.Header.Set("Authorization", "Bearer some-token") + + res, err := client.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + invitedUser := &libregraph.User{} + err = json.NewDecoder(res.Body).Decode(invitedUser) + if err != nil { + return nil, err + } + + response := &invitations.Invitation{ + InvitedUser: invitedUser, + } + if res.StatusCode == http.StatusCreated { + response.Status = "Completed" + } + + // optionally send an email + + return response, nil }