119 lines
2.8 KiB
Go
119 lines
2.8 KiB
Go
package server
|
|
|
|
import (
|
|
"git.xeserv.us/xena/route/lib/elfs"
|
|
proto "git.xeserv.us/xena/route/proto"
|
|
"github.com/Xe/ln"
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
// Route implements rout.RoutesServer for gRPC
|
|
type Route struct {
|
|
*Server
|
|
}
|
|
|
|
// interface assertions
|
|
var (
|
|
_ proto.RoutesServer = &Route{}
|
|
)
|
|
|
|
// Get fetches a route from the database.
|
|
func (r *Route) Get(ctx context.Context, req *proto.GetRouteRequest) (*proto.Route, error) {
|
|
clitok, err := r.getAuth(ctx, "route:get")
|
|
if err != nil {
|
|
return nil, handleError(ctx, clitok, err, ln.F{"action": "Route.Get_getAuth"})
|
|
}
|
|
|
|
val, err := r.db.GetRoute(ctx, req.Host)
|
|
if err != nil {
|
|
ln.Error(ctx, err, ln.F{"action": "Route.Get"})
|
|
|
|
return nil, err
|
|
}
|
|
|
|
if val.Creator != clitok.Owner {
|
|
return nil, handleError(ctx, clitok, ErrNotAuthorized, ln.F{"action": "Route.Get_wrong_ownership"})
|
|
}
|
|
|
|
return val.AsProto(), nil
|
|
}
|
|
|
|
// GetAll fetches all of the routes that you own.
|
|
func (r *Route) GetAll(ctx context.Context, req *proto.Nil) (*proto.GetAllRoutesResponse, error) {
|
|
clitok, err := r.getAuth(ctx, "route:getall")
|
|
if err != nil {
|
|
return nil, handleError(ctx, clitok, err, ln.F{"action": "Route.GetAll_getAuth"})
|
|
}
|
|
|
|
routes, err := r.db.GetAllRoutes(ctx, clitok.Owner)
|
|
if err != nil {
|
|
ln.Error(ctx, err, ln.F{"action": "Route.GetAll"})
|
|
|
|
return nil, err
|
|
}
|
|
|
|
result := []*proto.Route{}
|
|
|
|
// let result = apply routeAsProto routes
|
|
for _, rt := range routes {
|
|
result = append(result, rt.AsProto())
|
|
}
|
|
|
|
return &proto.GetAllRoutesResponse{
|
|
Routes: result,
|
|
}, nil
|
|
}
|
|
|
|
func (r *Route) Put(ctx context.Context, rt *proto.Route) (*proto.IDResponse, error) {
|
|
clitok, err := r.getAuth(ctx, "route:put")
|
|
if err != nil {
|
|
return nil, handleError(ctx, clitok, err, ln.F{"action": "Route.Put_getAuth"})
|
|
}
|
|
|
|
if rt.Host == "" {
|
|
rt.Host = elfs.MakeName() + r.cfg.DomainSuffix
|
|
}
|
|
|
|
drt, err := r.db.PutRoute(ctx, rt.Host, clitok.Owner)
|
|
if err != nil {
|
|
ln.Error(ctx, err, ln.F{"action": "Route.Put"})
|
|
|
|
return nil, err
|
|
}
|
|
|
|
ln.Log(ctx, drt, ln.F{"action": "Route.Put_success"})
|
|
|
|
return &proto.IDResponse{
|
|
Id: drt.ID,
|
|
}, nil
|
|
}
|
|
|
|
func (r *Route) Delete(ctx context.Context, rt *proto.Route) (*proto.IDResponse, error) {
|
|
clitok, err := r.getAuth(ctx, "route:delete")
|
|
if err != nil {
|
|
return nil, handleError(ctx, clitok, err, ln.F{"action": "Route.Delete_getAuth"})
|
|
}
|
|
|
|
drt, err := r.db.GetRoute(ctx, rt.Host)
|
|
if err != nil {
|
|
ln.Error(ctx, err, ln.F{"action": "Route.Delete_getRoute_verify"})
|
|
|
|
return nil, err
|
|
}
|
|
|
|
if drt.Creator != clitok.Owner {
|
|
return nil, handleError(ctx, clitok, ErrNotAuthorized, ln.F{"action": "Route.Delete_not_authorized"})
|
|
}
|
|
|
|
err = r.db.DeleteRoute(ctx, rt.Id)
|
|
f := drt.F()
|
|
f["action"] = "Route.Delete_db.DeleteRoute"
|
|
if err != nil {
|
|
handleError(ctx, clitok, ErrNotAuthorized, f)
|
|
}
|
|
|
|
ln.Log(ctx, f, drt)
|
|
|
|
return &proto.IDResponse{Id: rt.Id}, nil
|
|
}
|