/
handler_actor.go
76 lines (66 loc) · 1.95 KB
/
handler_actor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package charond
import (
"context"
"database/sql"
"github.com/golang/protobuf/ptypes/wrappers"
charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
"github.com/piotrkowalczuk/charon/internal/grpcerr"
"github.com/piotrkowalczuk/charon/internal/session"
"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
"google.golang.org/grpc/codes"
)
type actorHandler struct {
*handler
}
func (sh *actorHandler) Actor(ctx context.Context, r *wrappers.StringValue) (*charonrpc.ActorResponse, error) {
var ses *mnemosynerpc.Session
if r.Value == "" {
res, err := sh.session.Context(ctx, none())
if err != nil {
return nil, handleMnemosyneError(err)
}
ses = res.Session
} else {
res, err := sh.session.Get(ctx, &mnemosynerpc.GetRequest{
AccessToken: r.Value,
})
if err != nil {
return nil, handleMnemosyneError(err)
}
ses = res.Session
}
id, err := session.ActorID(ses.SubjectId).UserID()
if err != nil {
return nil, grpcerr.E(codes.Internal, "invalid session actor id")
}
ent, err := sh.repository.user.FindOneByID(ctx, id)
switch err {
case nil:
case sql.ErrNoRows:
return nil, grpcerr.E(codes.NotFound, "actor does not exists for given id")
default:
return nil, grpcerr.E(codes.Internal, "actor retrieval failure", err)
}
permissionEntities, err := sh.repository.permission.FindByUserID(ctx, id)
switch err {
case nil, sql.ErrNoRows:
default:
return nil, grpcerr.E(codes.Internal, "actor list of permissions failure", err)
}
permissions := make([]string, 0, len(permissionEntities))
for _, e := range permissionEntities {
permissions = append(permissions, e.Permission().String())
}
return &charonrpc.ActorResponse{
Id: int64(ent.ID),
Username: ent.Username,
FirstName: ent.FirstName,
LastName: ent.LastName,
Permissions: permissions,
IsActive: ent.IsActive,
IsConfirmed: ent.IsConfirmed,
IsStuff: ent.IsStaff,
IsStaff: ent.IsStaff,
IsSuperuser: ent.IsSuperuser,
}, nil
}