Skip to content

Commit

Permalink
implementation of API for creating application keys
Browse files Browse the repository at this point in the history
  • Loading branch information
PCloughster committed Aug 8, 2024
1 parent f6337c7 commit d026f3a
Show file tree
Hide file tree
Showing 6 changed files with 1,000 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pkg/service/account/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,11 @@ type ClientNotFoundError struct {
func (e *ClientNotFoundError) Error() string {
return fmt.Sprintf("Client not found with ID [%d]", e.ID)
}

type ApplicationNotFoundError struct {
ID string
}

func (e *ApplicationNotFoundError) Error() string {
return fmt.Sprintf("Application not found with ID [%s]", e.ID)
}
28 changes: 28 additions & 0 deletions pkg/service/account/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,31 @@ type Client struct {
NominetContactID string `json:"nominet_contact_id"`
CreatedDate string `json:"created_date"`
}

// Application represents an API Application
type Application struct {
ID string `json:"id"`
AppName string `json:"name"`
Description string `json:"description"`
CreatedDate string `json:"created_at"`
CreatedBy string `json:"created_by"`
}

type ApplicationService struct {
ID string `json:"id"`
Name string `json:"name"`
}

type ApplicationServiceMapping struct {
Scopes []ApplicationServiceScope `json:"scopes"`
}

type ApplicationServiceScope struct {
Service string `json:"service"`
Roles []string `json:"roles"`
}

type ApplicationRestriction struct {
RestrictionType string `json:"ip_restriction_type"`
IPRanges []string `json:"ip_ranges"`
}
14 changes: 14 additions & 0 deletions pkg/service/account/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,17 @@ type PatchClientRequest struct {
IDReference string `json:"id_reference,omitempty"`
NominetContactID string `json:"nominet_contact_id,omitempty"`
}

type CreateApplicationRequest struct {
Name string `json:"name"`
AppDescription string `json:"description"`
}

type SetServiceRequest struct {
Scopes []ApplicationServiceScope `json:"scopes"`
}

type SetRestrictionRequest struct {
RestrictionType string `json:"ip_restriction_type"`
IPRanges []string `json:"ip_ranges"`
}
12 changes: 12 additions & 0 deletions pkg/service/account/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ type AccountService interface {
GetInvoiceQueriesPaginated(parameters connection.APIRequestParameters) (*connection.Paginated[InvoiceQuery], error)
GetInvoiceQuery(invoiceQueryID int) (InvoiceQuery, error)
CreateInvoiceQuery(req CreateInvoiceQueryRequest) (int, error)

GetApplications(parameters connection.APIRequestParameters) ([]Application, error)
GetApplicationsPaginated(parameters connection.APIRequestParameters) (*connection.Paginated[Application], error)
GetServices(parameters connection.APIRequestParameters) ([]ApplicationService, error)
GetServicesPaginated(parameters connection.APIRequestParameters) (*connection.Paginated[ApplicationService], error)
GetApplication(appID string) (Application, error)
CreateApplication(req CreateApplicationRequest) (string, error)
GetApplicationServices(appID string) (ApplicationServiceMapping, error)
SetApplicationServices(appID string, req SetServiceRequest) error
GetApplicationRestrictions(appID string) (ApplicationRestriction, error)
SetApplicationRestrictions(appID string, req SetRestrictionRequest) error
DeleteApplication(appID string) error
}

// Service implements AccountService for managing
Expand Down
232 changes: 232 additions & 0 deletions pkg/service/account/service_application.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
package account

import (
"fmt"

"github.com/ans-group/sdk-go/pkg/connection"
)

// GetApplications retrieves a list of applications
func (s *Service) GetApplications(parameters connection.APIRequestParameters) ([]Application, error) {
return connection.InvokeRequestAll(s.GetApplicationsPaginated, parameters)
}

func (s *Service) GetApplicationsPaginated(parameters connection.APIRequestParameters) (*connection.Paginated[Application], error) {
body, err := s.getApplicationsPaginatedResponseBody(parameters)
return connection.NewPaginated(body, parameters, s.GetApplicationsPaginated), err
}

func (s *Service) getApplicationsPaginatedResponseBody(parameters connection.APIRequestParameters) (*connection.APIResponseBodyData[[]Application], error) {
body := &connection.APIResponseBodyData[[]Application]{}

response, err := s.connection.Get("/account/v1/applications", parameters)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, nil)
}

// GetApplication retrieves a single application by id
func (s *Service) GetApplication(appID string) (Application, error) {
body, err := s.getApplicationResponseBody(appID)

return body.Data, err
}

func (s *Service) getApplicationResponseBody(appID string) (*connection.APIResponseBodyData[Application], error) {
body := &connection.APIResponseBodyData[Application]{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Get(fmt.Sprintf("/account/v1/applications/%s", appID), connection.APIRequestParameters{})
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}

// GetApplications retrieves a list of applications
func (s *Service) GetServices(parameters connection.APIRequestParameters) ([]ApplicationService, error) {
return connection.InvokeRequestAll(s.GetServicesPaginated, parameters)
}

func (s *Service) GetServicesPaginated(parameters connection.APIRequestParameters) (*connection.Paginated[ApplicationService], error) {
body, err := s.getServicesPaginatedResponseBody(parameters)
return connection.NewPaginated(body, parameters, s.GetServicesPaginated), err
}

func (s *Service) getServicesPaginatedResponseBody(parameters connection.APIRequestParameters) (*connection.APIResponseBodyData[[]ApplicationService], error) {
body := &connection.APIResponseBodyData[[]ApplicationService]{}

response, err := s.connection.Get("/account/v1/services", parameters)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, nil)
}

func (s *Service) CreateApplication(req CreateApplicationRequest) (string, error) {
body, err := s.createApplicationResponseBody(req)

return body.Data.ID, err
}

func (s *Service) createApplicationResponseBody(req CreateApplicationRequest) (*connection.APIResponseBodyData[Application], error) {
body := &connection.APIResponseBodyData[Application]{}

response, err := s.connection.Post("/account/v1/applications", &req)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, nil)
}

// GetApplicationServices retrieves the services and roles of an application by id
func (s *Service) GetApplicationServices(appID string) (ApplicationServiceMapping, error) {
body, err := s.getApplicationServicesResponseBody(appID)

return body.Data, err
}

func (s *Service) getApplicationServicesResponseBody(appID string) (*connection.APIResponseBodyData[ApplicationServiceMapping], error) {
body := &connection.APIResponseBodyData[ApplicationServiceMapping]{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Get(fmt.Sprintf("/account/v1/applications/%s/services", appID), connection.APIRequestParameters{})
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}

func (s *Service) SetApplicationServices(appID string, req SetServiceRequest) error {
_, err := s.setApplicationServicesResponseBody(appID, req)

return err
}

func (s *Service) setApplicationServicesResponseBody(appID string, req SetServiceRequest) (*connection.APIResponseBody, error) {
body := &connection.APIResponseBody{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Put(fmt.Sprintf("/account/v1/applications/%s/services", appID), &req)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}

// DeleteApplication removes an application
func (s *Service) DeleteApplication(appID string) error {
_, err := s.deleteApplicationResponseBody(appID)

return err
}

func (s *Service) deleteApplicationResponseBody(appID string) (*connection.APIResponseBody, error) {
body := &connection.APIResponseBody{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Delete(fmt.Sprintf("/account/v1/applications/%s", appID), nil)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}

// GetApplicationRestrictions retrieves the IP restrictions of an application by id
func (s *Service) GetApplicationRestrictions(appID string) (ApplicationRestriction, error) {
body, err := s.getApplicationRestrictionsResponseBody(appID)

return body.Data, err
}

func (s *Service) getApplicationRestrictionsResponseBody(appID string) (*connection.APIResponseBodyData[ApplicationRestriction], error) {
body := &connection.APIResponseBodyData[ApplicationRestriction]{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Get(fmt.Sprintf("/account/v1/applications/%s/ip-restrictions", appID), connection.APIRequestParameters{})
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}

func (s *Service) SetApplicationRestrictions(appID string, req SetRestrictionRequest) error {
_, err := s.setApplicationRestrictionsResponseBody(appID, req)

return err
}

func (s *Service) setApplicationRestrictionsResponseBody(appID string, req SetRestrictionRequest) (*connection.APIResponseBody, error) {
body := &connection.APIResponseBody{}

if appID == "" {
return body, fmt.Errorf("invalid application id")
}

response, err := s.connection.Put(fmt.Sprintf("/account/v1/applications/%s/ip-restrictions", appID), &req)
if err != nil {
return body, err
}

return body, response.HandleResponse(body, func(resp *connection.APIResponse) error {
if response.StatusCode == 404 {
return &ApplicationNotFoundError{ID: appID}
}

return nil
})
}
Loading

0 comments on commit d026f3a

Please sign in to comment.