timoth-y/kicksware-api

View on GitHub
services/users/api/gRPC/handler.go

Summary

Maintainability
A
0 mins
Test Coverage
package gRPC

//go:generate protoc --proto_path=../../../service-protos  --go_out=plugins=grpc,paths=source_relative:proto/. user.proto
//go:generate protoc --proto_path=../../../service-protos  --go_out=plugins=grpc,paths=source_relative:proto/. auth.proto
//go:generate protoc --proto_path=../../../service-protos  --go_out=plugins=grpc,paths=source_relative:proto/. mail.proto
//go:generate protoc --proto_path=../../../service-protos  --go_out=plugins=grpc,paths=source_relative:proto/. interact.proto

import (
    "context"

    "github.com/pkg/errors"
    "go.kicksware.com/api/shared/core/meta"

    "go.kicksware.com/api/services/users/api/gRPC/proto"
    "go.kicksware.com/api/services/users/core/model"
    "go.kicksware.com/api/services/users/core/service"
    "go.kicksware.com/api/services/users/usecase/business"
)

type Handler struct {
    service  service.UserService
    auth     service.AuthService
    mail     service.MailService
    interact service.InteractService
}

func NewHandler(service service.UserService, auth service.AuthService, mail service.MailService,
    interact service.InteractService) *Handler {
    return &Handler{
        service,
        auth,
        mail,
        interact,
    }
}

func (h*Handler) GetUsers(ctx context.Context, filter *proto.UserFilter) (r *proto.UserResponse, err error) {
    var users []*model.User
    var params *meta.RequestParams; if filter != nil && filter.RequestParams != nil {
        params = filter.RequestParams.ToNative()
    }

    if len(filter.UserID) == 0 && filter.RequestQuery == nil  {
        users, err = h.service.FetchAll(params)
    } else if filter.RequestQuery != nil {
        query, _ := meta.NewRequestQuery(filter.RequestQuery)
        users, err = h.service.FetchQuery(query, params)
    } else if len(filter.UserID) == 1 {
        user, e := h.service.FetchOne(filter.UserID[0]); if e != nil {
            err = e
        }
        users = []*model.User{user}
    } else {
        users, err = h.service.Fetch(filter.UserID, params)
    }

    if errors.Cause(err) == business.ErrUserNotFound {
        return &proto.UserResponse{
            Count: 0,
        }, nil
    }

    r = &proto.UserResponse{
        Users: proto.NativeToUsers(users),
        Count: int64(len(users)),
    }
    return
}

func (h*Handler) CountUsers(ctx context.Context, filter *proto.UserFilter) (r *proto.UserResponse, err error) {
    var count int = 0
    var params *meta.RequestParams; if filter != nil && filter.RequestParams != nil {
        params = filter.RequestParams.ToNative()
    }

    if filter == nil {
        count, err = h.service.CountAll()
    } else if filter.RequestQuery != nil {
        query, _ := meta.NewRequestQuery(filter.RequestQuery)
        count, err = h.service.Count(query, params)
    }

    r = &proto.UserResponse{
        Users: nil,
        Count: int64(count),
    }
    return
}

func (h*Handler) AddUsers(ctx context.Context, input *proto.UserInput) (*proto.UserResponse, error) {
    var succeeded int64
    var users []*model.User

    for _, user := range input.Users {
        native := user.ToNative()
        if err := h.service.Register(native); err != nil {
            succeeded = succeeded + 1
            users = append(users, native)
        }
    }

    return &proto.UserResponse{
        Users: proto.NativeToUsers(users),
        Count: succeeded,
    }, nil
}

func (h*Handler) EditUsers(ctx context.Context, input *proto.UserInput) (*proto.UserResponse, error) {
    var succeeded int64

    for _, user := range input.Users {
        if err := h.service.Modify(user.ToNative()); err != nil {
            succeeded = succeeded + 1
        }
    }

    return &proto.UserResponse{Count: succeeded}, nil
}

func (h Handler) DeleteUsers(ctx context.Context, filter *proto.UserFilter) (*proto.UserResponse, error) {
    panic("implement me")
}

func (h *Handler) GetTheme(ctx context.Context, filter *proto.UserFilter) (*proto.UserTheme, error) {
    if len(filter.UserID) == 0 {
        return nil, nil
    }
    user, err := h.service.FetchOne(filter.UserID[0]); if err != nil {
        return nil, err
    }
    return &proto.UserTheme{
        Theme: user.Settings.Theme,
    }, nil
}