Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions admin/adminserver/controllers/clubs.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,9 @@ func (controller *Clubs) DeleteCard(w http.ResponseWriter, r *http.Request) {
}

if err = controller.clubs.Delete(ctx, squadID, cardID); err != nil {
if clubs.ForbiddenAction.Has(err) {
http.Error(w, err.Error(), http.StatusForbidden)
}
controller.log.Error("could not delete card", ErrClubs.Wrap(err))
http.Error(w, err.Error(), http.StatusInternalServerError)
return
Expand Down
2 changes: 1 addition & 1 deletion admin/adminserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"net"
"net/http"
"path/filepath"
"ultimatedivision/seasons"

"github.com/gorilla/mux"
"github.com/zeebo/errs"
Expand All @@ -30,6 +29,7 @@ import (
"ultimatedivision/marketplace"
"ultimatedivision/pkg/auth"
"ultimatedivision/queue"
"ultimatedivision/seasons"
"ultimatedivision/users"
)

Expand Down
14 changes: 14 additions & 0 deletions clubs/clubs.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ var ErrNoSquad = errs.Class("squad does not exist")
// ErrNoSquadCard indicated that squad card does not exist.
var ErrNoSquadCard = errs.Class("squad card does not exist")

// ForbiddenAction indicated that user is forbidden to make action with club.
var ForbiddenAction = errs.Class("forbidden action")

// DB is exposing access to clubs db.
//
// architecture: DB
Expand Down Expand Up @@ -83,6 +86,7 @@ type Club struct {
Name string `json:"name"`
Status Status `json:"status"`
DivisionID uuid.UUID `json:"divisionId"`
Ownership Ownership `json:"ownership"`
CreatedAt time.Time `json:"createdAt"`
}

Expand All @@ -106,6 +110,16 @@ type SquadCard struct {
// SquadSize defines number of cards in the full squad.
const SquadSize int = 11

// Ownership defines a list of possible ownerships.
type Ownership int

const (
// OwnershipManager defines manager type of ownership.
OwnershipManager Ownership = 0
// OwnershipOwner defines owner type of ownership.
OwnershipOwner Ownership = 1
)

// Formation defines a list of possible formations.
type Formation int

Expand Down
4 changes: 4 additions & 0 deletions clubs/clubs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ func TestTeam(t *testing.T) {
Name: testUser.NickName,
Status: clubs.StatusActive,
DivisionID: division1.ID,
Ownership: clubs.OwnershipOwner,
CreatedAt: time.Now().UTC(),
}

Expand All @@ -55,6 +56,7 @@ func TestTeam(t *testing.T) {
Name: testUser.NickName,
Status: clubs.StatusInactive,
DivisionID: division1.ID,
Ownership: clubs.OwnershipOwner,
CreatedAt: time.Now().UTC(),
}

Expand All @@ -63,6 +65,7 @@ func TestTeam(t *testing.T) {
OwnerID: testUser.ID,
Name: testUser.NickName,
Status: clubs.StatusInactive,
Ownership: clubs.OwnershipOwner,
CreatedAt: time.Now().UTC(),
}

Expand All @@ -71,6 +74,7 @@ func TestTeam(t *testing.T) {
OwnerID: testUser.ID,
Name: testUser.NickName,
Status: clubs.StatusActive,
Ownership: clubs.OwnershipOwner,
CreatedAt: time.Now().UTC(),
}

Expand Down
53 changes: 50 additions & 3 deletions clubs/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

"ultimatedivision/cards"
"ultimatedivision/divisions"
"ultimatedivision/managers"
"ultimatedivision/users"
)

Expand All @@ -26,15 +27,17 @@ type Service struct {
clubs DB
users *users.Service
cards *cards.Service
managers *managers.Service
divisions divisions.DB
}

// NewService is a constructor for clubs service.
func NewService(clubs DB, users *users.Service, cards *cards.Service, divisions divisions.DB) *Service {
func NewService(clubs DB, users *users.Service, cards *cards.Service, managers *managers.Service, divisions divisions.DB) *Service {
return &Service{
clubs: clubs,
users: users,
cards: cards,
managers: managers,
divisions: divisions,
}
}
Expand All @@ -57,6 +60,7 @@ func (service *Service) Create(ctx context.Context, userID uuid.UUID) (uuid.UUID
Name: nickname,
CreatedAt: time.Now().UTC(),
DivisionID: division.ID,
Ownership: OwnershipOwner,
}

allClubs, err := service.ListByUserID(ctx, userID)
Expand Down Expand Up @@ -97,6 +101,20 @@ func (service *Service) CreateSquad(ctx context.Context, clubID uuid.UUID) (uuid

// AddSquadCard adds card to the squad.
func (service *Service) AddSquadCard(ctx context.Context, squadID uuid.UUID, newSquadCard SquadCard) error {
squad, err := service.GetSquad(ctx, squadID)
if err != nil {
return ErrClubs.Wrap(err)
}

isClubManaged, err := service.managers.IsClubHasManager(ctx, squad.ClubID)
if err != nil {
return managers.ErrManagers.Wrap(err)
}

if isClubManaged {
return ForbiddenAction.New("could not delete card from squad: club has manager")
}

squadCards, err := service.clubs.ListSquadCards(ctx, squadID)
if err != nil {
return ErrClubs.Wrap(err)
Expand Down Expand Up @@ -131,6 +149,20 @@ func (service *Service) AddSquadCard(ctx context.Context, squadID uuid.UUID, new

// Delete deletes card from squad.
func (service *Service) Delete(ctx context.Context, squadID, cardID uuid.UUID) error {
squad, err := service.GetSquad(ctx, squadID)
if err != nil {
return ErrClubs.Wrap(err)
}

isClubManaged, err := service.managers.IsClubHasManager(ctx, squad.ClubID)
if err != nil {
return managers.ErrManagers.Wrap(err)
}

if isClubManaged {
return ForbiddenAction.New("could not delete card from squad: club has manager")
}

return ErrClubs.Wrap(service.clubs.DeleteSquadCard(ctx, squadID, cardID))
}

Expand Down Expand Up @@ -247,8 +279,23 @@ func (service *Service) ListSquadCards(ctx context.Context, squadID uuid.UUID) (

// ListByUserID returns user's clubs.
func (service *Service) ListByUserID(ctx context.Context, userID uuid.UUID) ([]Club, error) {
club, err := service.clubs.ListByUserID(ctx, userID)
return club, ErrClubs.Wrap(err)
userClubs, err := service.clubs.ListByUserID(ctx, userID)
if err != nil {
return userClubs, ErrClubs.Wrap(err)
}

managedClubs, err := service.managers.ListByUserID(ctx, userID)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe one db method needs to be done for this?

for _, managedClub := range managedClubs {
club, err := service.Get(ctx, managedClub.ClubID)
if err != nil {
return userClubs, ErrClubs.Wrap(err)
}
club.Ownership = OwnershipManager

userClubs = append(userClubs, club)
}

return userClubs, ErrClubs.Wrap(err)
}

// Get returns club.
Expand Down
12 changes: 10 additions & 2 deletions console/consoleserver/controllers/clubs.go
Original file line number Diff line number Diff line change
Expand Up @@ -321,8 +321,6 @@ func (controller *Clubs) Add(w http.ResponseWriter, r *http.Request) {
return
}

squadCard.CardID = cardID

if err = json.NewDecoder(r.Body).Decode(&squadCard); err != nil {
controller.serveError(w, http.StatusBadRequest, ErrClubs.Wrap(err))
}
Expand All @@ -335,6 +333,11 @@ func (controller *Clubs) Add(w http.ResponseWriter, r *http.Request) {
}

if err = controller.clubs.AddSquadCard(ctx, squadID, squadCard); err != nil {
if clubs.ForbiddenAction.Has(err) {
controller.serveError(w, http.StatusForbidden, ErrClubs.Wrap(err))
return
}

controller.log.Error("could not add card to the squad", ErrClubs.Wrap(err))
controller.serveError(w, http.StatusInternalServerError, ErrClubs.Wrap(err))
return
Expand Down Expand Up @@ -367,6 +370,11 @@ func (controller *Clubs) Delete(w http.ResponseWriter, r *http.Request) {
return
}

if clubs.ForbiddenAction.Has(err) {
controller.serveError(w, http.StatusForbidden, ErrClubs.Wrap(err))
return
}

controller.serveError(w, http.StatusInternalServerError, ErrClubs.Wrap(err))
return
}
Expand Down
80 changes: 80 additions & 0 deletions console/consoleserver/controllers/managers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (C) 2021 Creditor Corp. Group.
// See LICENSE for copying information.

package controllers

import (
"encoding/json"
"net/http"

"github.com/google/uuid"
"github.com/gorilla/mux"
"github.com/zeebo/errs"

"ultimatedivision/internal/logger"
"ultimatedivision/managers"
)

var (
// ErrManagers is an internal error type for managers controller.
ErrManagers = errs.Class("managers controller error")
)

// Managers is a mvc controller that handles all managers related views.
type Managers struct {
log logger.Logger

managers *managers.Service
}

// NewManagers is a constructor for managers controller.
func NewManagers(log logger.Logger, managers *managers.Service) *Managers {
managersController := &Managers{
log: log,
managers: managers,
}

return managersController
}

// Create is ann endpoint that creates manager for club.
func (controller *Managers) Create(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
ctx := r.Context()
params := mux.Vars(r)

clubID, err := uuid.Parse(params["clubId"])
if err != nil {
controller.serveError(w, http.StatusBadRequest, ErrManagers.Wrap(err))
return
}

var manager managers.Manager

if err = json.NewDecoder(r.Body).Decode(&manager); err != nil {
controller.serveError(w, http.StatusBadRequest, ErrManagers.Wrap(err))
return
}

err = controller.managers.Create(ctx, manager.EndedAt, manager.UserID, clubID)
if err != nil {
controller.log.Error("could not create manager", ErrManagers.Wrap(err))
controller.serveError(w, http.StatusInternalServerError, ErrManagers.Wrap(err))
return
}
}

// serveError replies to the request with specific code and error message.
func (controller *Managers) serveError(w http.ResponseWriter, status int, err error) {
w.WriteHeader(status)

var response struct {
Error string `json:"error"`
}

response.Error = err.Error()

if err = json.NewEncoder(w).Encode(response); err != nil {
controller.log.Error("failed to write json error response", ErrManagers.Wrap(err))
}
}
5 changes: 4 additions & 1 deletion console/consoleserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"ultimatedivision/gameplay/matches"
"ultimatedivision/internal/logger"
"ultimatedivision/lootboxes"
"ultimatedivision/managers"
"ultimatedivision/marketplace"
"ultimatedivision/pkg/auth"
"ultimatedivision/queue"
Expand Down Expand Up @@ -68,7 +69,7 @@ type Server struct {
// NewServer is a constructor for console web server.
func NewServer(config Config, log logger.Logger, listener net.Listener, cards *cards.Service, lootBoxes *lootboxes.Service,
marketplace *marketplace.Service, clubs *clubs.Service, userAuth *userauth.Service, users *users.Service,
queue *queue.Service, seasons *seasons.Service, waitList *waitlist.Service, matches *matches.Service) *Server {
queue *queue.Service, seasons *seasons.Service, waitList *waitlist.Service, matches *matches.Service, managers *managers.Service) *Server {
server := &Server{
log: log,
config: config,
Expand All @@ -90,6 +91,7 @@ func NewServer(config Config, log logger.Logger, listener net.Listener, cards *c
seasonsController := controllers.NewSeasons(log, seasons)
waitListController := controllers.NewWaitList(log, waitList)
matchesController := controllers.NewMatches(log, matches)
managersController := controllers.NewManagers(log, managers)

router := mux.NewRouter()
router.HandleFunc("/register", authController.RegisterTemplateHandler).Methods(http.MethodGet)
Expand Down Expand Up @@ -119,6 +121,7 @@ func NewServer(config Config, log logger.Logger, listener net.Listener, cards *c
clubsRouter.Use(server.withAuth)
clubsRouter.HandleFunc("", clubsController.Create).Methods(http.MethodPost)
clubsRouter.HandleFunc("", clubsController.Get).Methods(http.MethodGet)
clubsRouter.HandleFunc("/{clubId}", managersController.Create).Methods(http.MethodPost)
clubsRouter.HandleFunc("/{clubId}", clubsController.UpdateStatus).Methods(http.MethodPatch)

squadRouter := clubsRouter.PathPrefix("/{clubId}/squads").Subrouter()
Expand Down
3 changes: 2 additions & 1 deletion database/admins.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ import (
"context"
"database/sql"
"errors"
"ultimatedivision/admin/admins"

"github.com/google/uuid"
"github.com/zeebo/errs"

"ultimatedivision/admin/admins"
)

// ErrAdmins indicates that there was an error in the database.
Expand Down
Loading