package gapi import ( "context" "database/sql" "errors" "log/slog" "github.com/itsscb/df/bff/pb" "google.golang.org/genproto/googleapis/rpc/errdetails" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) func (server *Server) GetAccountInfo(ctx context.Context, req *pb.GetAccountInfoRequest) (*pb.GetAccountInfoResponse, error) { authPayload, err := server.authorizeUser(ctx) if err != nil { return nil, unauthenticatedError(err) } violations := validateGetAccountInfoRequest(req) if violations != nil { return nil, invalidArgumentError(violations) } account, err := server.store.GetAccountInfo(ctx, req.GetAccountId()) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, status.Errorf(codes.NotFound, "account not found") } slog.Error("get_account (db)", slog.Int64("invoked_by", int64(authPayload.AccountID)), slog.Int64("account_id", int64(req.GetAccountId())), slog.String("error", err.Error())) return nil, status.Error(codes.Internal, "failed to get account") } if authPayload.AccountID != account.AccountID { if !server.isAdmin(ctx, authPayload) { return nil, status.Error(codes.NotFound, "account not found") } } rsp := &pb.GetAccountInfoResponse{ AccountInfo: convertAccountInfo(account), } return rsp, nil } func validateGetAccountInfoRequest(req *pb.GetAccountInfoRequest) (violations []*errdetails.BadRequest_FieldViolation) { if req.GetAccountId() < 1 { violations = append(violations, fieldViolation("id", errors.New("must be greater than 0"))) } return violations }