package dto import ( "errors" "net/url" "time" "github.com/hashicorp/uuid" ) type ClientInformationResponse struct { ClientId string `json:"client_id"` ClientSecret string `json:"client_secret"` ClientIdIssuedAt int64 `json:"client_id_issued_at"` ClientSecretExpiresAt int64 `json:"client_secret_expires_at"` ClientMetadata } func NewClientInformationResponse(request *ClientRegistrationRequest) *ClientInformationResponse { expiresAt := time.Now().Add(time.Duration(1) * time.Hour) return &ClientInformationResponse{ ClientMetadata: ClientMetadata{ RedirectUris: request.RedirectUris, ClientName: request.ClientName, TokenEndpointAuthMethod: request.TokenEndpointAuthMethod, LogoUri: request.LogoUri, JWKSUri: request.JWKSUri, }, ClientId: uuid.GenerateUUID(), ClientIdIssuedAt: time.Now().Unix(), ClientSecret: uuid.GenerateUUID(), ClientSecretExpiresAt: expiresAt.Unix(), } } type ClientRegistrationError error var ( InvalidClientMetadata ClientRegistrationError = errors.New("invalid_client_metadata") InvalidRedirectUri = errors.New("invalid_redirect_uri") InvalidSoftwareStatement = errors.New("invalid_software_statement") UnapprovedSoftwareStatement = errors.New("unapproved_software_statement") ) func (x *ClientInformationResponse) Valid() ClientRegistrationError { if x.ClientName == "" { return InvalidClientMetadata } if len(x.RedirectUris) == 0 { return InvalidRedirectUri } for _, item := range x.RedirectUris { if _, err := url.ParseRequestURI(item); err != nil { return InvalidRedirectUri } } return nil }