scopes

Paddy 2015-12-05 Child:b93938562a17

0:b2ab1ab8f157 Go to Latest

scopes/scope.go

First pass at a scopes package. We need a minimal scopes package that we'll be able to share around. I don't want it embedded in auth, because then all the requirements of auth have to be pulled into whatever package wants to import type Scope, which seems silly. So this is the bare minimum of the beginning of a new service that separates Scopes out from auth.

History
paddy@0 1 package scopes
paddy@0 2
paddy@0 3 import (
paddy@0 4 "errors"
paddy@0 5 "fmt"
paddy@0 6
paddy@0 7 "golang.org/x/net/context"
paddy@0 8 )
paddy@0 9
paddy@0 10 var (
paddy@0 11 ErrNoStorer = errors.New("Storer not set in Context")
paddy@0 12 ErrScopeNotFound = errors.New("Scope not found")
paddy@0 13 )
paddy@0 14
paddy@0 15 type ErrScopeAlreadyExists string
paddy@0 16
paddy@0 17 func (e ErrScopeAlreadyExists) Error() string {
paddy@0 18 return fmt.Sprintf("scope %s already exists", string(e))
paddy@0 19 }
paddy@0 20
paddy@0 21 // Scope represents a limit on the access that a grant provides.
paddy@0 22 type Scope struct {
paddy@0 23 ID string
paddy@0 24 Name string
paddy@0 25 Description string
paddy@0 26 }
paddy@0 27
paddy@0 28 func ApplyChange(change ScopeChange, scope Scope) Scope {
paddy@0 29 changed := scope
paddy@0 30 if change.Name != nil {
paddy@0 31 changed.Name = *change.Name
paddy@0 32 }
paddy@0 33 if change.Description != nil {
paddy@0 34 changed.Description = *change.Description
paddy@0 35 }
paddy@0 36 return changed
paddy@0 37 }
paddy@0 38
paddy@0 39 type Scopes []Scope
paddy@0 40
paddy@0 41 func (s Scopes) Len() int {
paddy@0 42 return len(s)
paddy@0 43 }
paddy@0 44
paddy@0 45 func (s Scopes) Swap(i, j int) {
paddy@0 46 s[i], s[j] = s[j], s[i]
paddy@0 47 }
paddy@0 48
paddy@0 49 func (s Scopes) Less(i, j int) bool {
paddy@0 50 return s[i].ID < s[j].ID
paddy@0 51 }
paddy@0 52
paddy@0 53 func (s Scopes) Strings() []string {
paddy@0 54 res := make([]string, len(s))
paddy@0 55 for pos, scope := range s {
paddy@0 56 res[pos] = scope.ID
paddy@0 57 }
paddy@0 58 return res
paddy@0 59 }
paddy@0 60
paddy@0 61 func stringsToScopes(s []string) Scopes {
paddy@0 62 res := make(Scopes, len(s))
paddy@0 63 for pos, scope := range s {
paddy@0 64 res[pos] = Scope{ID: scope}
paddy@0 65 }
paddy@0 66 return res
paddy@0 67 }
paddy@0 68
paddy@0 69 // ScopeChange represents a change to a Scope.
paddy@0 70 type ScopeChange struct {
paddy@0 71 ScopeID string
paddy@0 72 Name *string
paddy@0 73 Description *string
paddy@0 74 }
paddy@0 75
paddy@0 76 func (s ScopeChange) Empty() bool {
paddy@0 77 return s.Name == nil && s.Description == nil
paddy@0 78 }
paddy@0 79
paddy@0 80 type Storer interface {
paddy@0 81 CreateScopes(scopes []Scope, ctx context.Context) error
paddy@0 82 GetScopes(ids []string, ctx context.Context) (map[string]Scope, error)
paddy@0 83 UpdateScope(change ScopeChange, ctx context.Context) error
paddy@0 84 RemoveScopes(ids []string, ctx context.Context) error
paddy@0 85 ListScopes(ctx context.Context) ([]Scope, error)
paddy@0 86 }