auth

Paddy 2015-05-11 Parent:73e12d5a1124

166:c45b946abe78 Go to Latest

auth/scope_postgres.go

Implement a GetProfileHandler. Create a Handler that will allow us to return details about a Profile. Right now, you only get a single Profile at a time, which is problematic, because it will lead to N+1 requests. But we have no reason to retrieve anyone _else_'s Profile, so it's not like you need to be fetching any Profile other than your own. Also, this requires a Token issued for the Profile in question, which means you're limited to one Profile per request, anyways. Future avenues for exploration may be an admin Token granting access to many Profiles, the unspecified service flow for accessing the API, or simply accepting that name, join date, last active date, and ID are "public information".

History
paddy@152 1 package auth
paddy@152 2
paddy@152 3 import (
paddy@163 4 "code.secondbit.org/pqarrays.hg"
paddy@163 5 "database/sql/driver"
paddy@153 6 "github.com/lib/pq"
paddy@152 7 "github.com/secondbit/pan"
paddy@152 8 )
paddy@152 9
paddy@152 10 func (s Scope) GetSQLTableName() string {
paddy@152 11 return "scopes"
paddy@152 12 }
paddy@152 13
paddy@163 14 func (s Scopes) Value() (driver.Value, error) {
paddy@163 15 ids := make(pqarrays.StringArray, 0, len(s))
paddy@163 16 for _, scope := range s {
paddy@163 17 ids = append(ids, scope.ID)
paddy@163 18 }
paddy@163 19 return ids.Value()
paddy@163 20 }
paddy@163 21
paddy@163 22 func (s *Scopes) Scan(value interface{}) error {
paddy@163 23 *s = (*s)[:0]
paddy@163 24 var ids pqarrays.StringArray
paddy@163 25 err := ids.Scan(value)
paddy@163 26 if err != nil {
paddy@163 27 return err
paddy@163 28 }
paddy@163 29 for _, id := range ids {
paddy@163 30 *s = append(*s, Scope{ID: id})
paddy@163 31 }
paddy@163 32 return nil
paddy@163 33 }
paddy@163 34
paddy@152 35 func (p *postgres) createScopesSQL(scopes []Scope) *pan.Query {
paddy@152 36 fields, _ := pan.GetFields(scopes[0])
paddy@152 37 query := pan.New(pan.POSTGRES, "INSERT INTO "+pan.GetTableName(scopes[0]))
paddy@152 38 query.Include("(" + pan.QueryList(fields) + ")")
paddy@152 39 query.Include("VALUES")
paddy@153 40 query.FlushExpressions(" ")
paddy@152 41 for _, scope := range scopes {
paddy@152 42 _, values := pan.GetFields(scope)
paddy@152 43 query.Include("("+pan.VariableList(len(values))+")", values...)
paddy@152 44 }
paddy@153 45 return query.FlushExpressions(", ")
paddy@152 46 }
paddy@152 47
paddy@152 48 func (p *postgres) createScopes(scopes []Scope) error {
paddy@152 49 if len(scopes) < 1 {
paddy@152 50 return nil
paddy@152 51 }
paddy@152 52 query := p.createScopesSQL(scopes)
paddy@152 53 _, err := p.db.Exec(query.String(), query.Args...)
paddy@153 54 if e, ok := err.(*pq.Error); ok && e.Constraint == "scopes_pkey" {
paddy@153 55 err = ErrScopeAlreadyExists
paddy@153 56 }
paddy@152 57 return err
paddy@152 58 }
paddy@152 59
paddy@152 60 func (p *postgres) getScopesSQL(ids []string) *pan.Query {
paddy@152 61 var scope Scope
paddy@152 62 intids := make([]interface{}, len(ids))
paddy@152 63 for pos, id := range ids {
paddy@152 64 intids[pos] = id
paddy@152 65 }
paddy@152 66 fields, _ := pan.GetFields(scope)
paddy@152 67 query := pan.New(pan.POSTGRES, "SELECT "+pan.QueryList(fields)+" FROM "+pan.GetTableName(scope))
paddy@152 68 query.IncludeWhere()
paddy@152 69 query.Include(pan.GetUnquotedColumn(scope, "ID") + " IN")
paddy@152 70 query.Include("("+pan.VariableList(len(ids))+")", intids...)
paddy@152 71 return query.FlushExpressions(" ")
paddy@152 72 }
paddy@152 73
paddy@152 74 func (p *postgres) getScopes(ids []string) ([]Scope, error) {
paddy@152 75 query := p.getScopesSQL(ids)
paddy@152 76 rows, err := p.db.Query(query.String(), query.Args...)
paddy@152 77 if err != nil {
paddy@152 78 return []Scope{}, err
paddy@152 79 }
paddy@152 80 var scopes []Scope
paddy@152 81 for rows.Next() {
paddy@152 82 var scope Scope
paddy@152 83 err := pan.Unmarshal(rows, &scope)
paddy@152 84 if err != nil {
paddy@152 85 return scopes, err
paddy@152 86 }
paddy@152 87 scopes = append(scopes, scope)
paddy@152 88 }
paddy@152 89 if err = rows.Err(); err != nil {
paddy@152 90 return scopes, err
paddy@152 91 }
paddy@152 92 return scopes, nil
paddy@152 93 }
paddy@152 94
paddy@152 95 func (p *postgres) updateScopeSQL(id string, change ScopeChange) *pan.Query {
paddy@152 96 var scope Scope
paddy@152 97 query := pan.New(pan.POSTGRES, "UPDATE "+pan.GetTableName(scope)+" SET ")
paddy@152 98 query.IncludeIfNotNil(pan.GetUnquotedColumn(scope, "Name")+" = ?", change.Name)
paddy@152 99 query.IncludeIfNotNil(pan.GetUnquotedColumn(scope, "Description")+" = ?", change.Description)
paddy@152 100 query.FlushExpressions(", ")
paddy@152 101 query.IncludeWhere()
paddy@152 102 query.Include(pan.GetUnquotedColumn(scope, "ID")+" = ?", id)
paddy@152 103 return query.FlushExpressions(" ")
paddy@152 104 }
paddy@152 105
paddy@152 106 func (p *postgres) updateScope(id string, change ScopeChange) error {
paddy@152 107 if change.Empty() {
paddy@152 108 return nil
paddy@152 109 }
paddy@152 110 query := p.updateScopeSQL(id, change)
paddy@153 111 res, err := p.db.Exec(query.String(), query.Args...)
paddy@153 112 if err != nil {
paddy@153 113 return err
paddy@153 114 }
paddy@153 115 rows, err := res.RowsAffected()
paddy@153 116 if err != nil {
paddy@153 117 return err
paddy@153 118 }
paddy@153 119 if rows < 1 {
paddy@153 120 return ErrScopeNotFound
paddy@153 121 }
paddy@152 122 return err
paddy@152 123 }
paddy@152 124
paddy@152 125 func (p *postgres) removeScopesSQL(ids []string) *pan.Query {
paddy@152 126 var scope Scope
paddy@152 127 intids := make([]interface{}, len(ids))
paddy@152 128 for pos, id := range ids {
paddy@152 129 intids[pos] = id
paddy@152 130 }
paddy@152 131 query := pan.New(pan.POSTGRES, "DELETE FROM "+pan.GetTableName(scope))
paddy@152 132 query.IncludeWhere()
paddy@152 133 query.Include(pan.GetUnquotedColumn(scope, "ID") + " IN")
paddy@152 134 query.Include("("+pan.VariableList(len(ids))+")", intids...)
paddy@152 135 return query.FlushExpressions(" ")
paddy@152 136 }
paddy@152 137
paddy@152 138 func (p *postgres) removeScopes(ids []string) error {
paddy@152 139 query := p.removeScopesSQL(ids)
paddy@153 140 res, err := p.db.Exec(query.String(), query.Args...)
paddy@152 141 if err != nil {
paddy@152 142 return err
paddy@152 143 }
paddy@153 144 rows, err := res.RowsAffected()
paddy@153 145 if err != nil {
paddy@153 146 return err
paddy@153 147 }
paddy@153 148 if rows < 1 {
paddy@153 149 return ErrScopeNotFound
paddy@153 150 }
paddy@152 151 return nil
paddy@152 152 }
paddy@152 153
paddy@152 154 func (p *postgres) listScopesSQL() *pan.Query {
paddy@152 155 var scope Scope
paddy@152 156 fields, _ := pan.GetFields(scope)
paddy@152 157 query := pan.New(pan.POSTGRES, "SELECT "+pan.QueryList(fields)+" FROM "+pan.GetTableName(scope))
paddy@152 158 return query.FlushExpressions(" ")
paddy@152 159 }
paddy@152 160
paddy@152 161 func (p *postgres) listScopes() ([]Scope, error) {
paddy@152 162 query := p.listScopesSQL()
paddy@152 163 rows, err := p.db.Query(query.String(), query.Args...)
paddy@152 164 if err != nil {
paddy@152 165 return []Scope{}, err
paddy@152 166 }
paddy@152 167 var scopes []Scope
paddy@152 168 for rows.Next() {
paddy@152 169 var scope Scope
paddy@152 170 err = pan.Unmarshal(rows, &scope)
paddy@152 171 if err != nil {
paddy@152 172 return scopes, err
paddy@152 173 }
paddy@152 174 scopes = append(scopes, scope)
paddy@152 175 }
paddy@152 176 if err = rows.Err(); err != nil {
paddy@152 177 return scopes, err
paddy@152 178 }
paddy@152 179 return scopes, nil
paddy@152 180 }