summaryrefslogtreecommitdiff
path: root/nexus/services/character/character.go
diff options
context:
space:
mode:
Diffstat (limited to 'nexus/services/character/character.go')
-rw-r--r--nexus/services/character/character.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/nexus/services/character/character.go b/nexus/services/character/character.go
new file mode 100644
index 0000000..c607d66
--- /dev/null
+++ b/nexus/services/character/character.go
@@ -0,0 +1,79 @@
+package character
+
+import (
+ "fmt"
+ "nexus/models"
+ "nexus/repositories/character"
+ "nexus/repositories/realm"
+ characterTypes "nexus/types/character"
+ "nexus/utils/logger"
+ "nexus/utils/shortcuts"
+
+ "github.com/gofiber/fiber/v2"
+ "github.com/google/uuid"
+)
+
+func GetAllForAccount(accountID uuid.UUID) ([]models.Character, *fiber.Error) {
+ characters, err := character.FindByAccountID(accountID)
+ if err != nil {
+ logger.Errorf(LogPrefix, CharactersFetchFailed, err)
+ return nil, shortcuts.ServiceError(fiber.StatusInternalServerError, fmt.Sprintf(CharactersFetchFailed, err))
+ }
+ return characters, nil
+}
+
+func GetByID(id uuid.UUID, accountID uuid.UUID) (*models.Character, *fiber.Error) {
+ c, err := character.FindByID(id)
+ if err != nil {
+ return nil, shortcuts.ServiceError(fiber.StatusNotFound, ErrCharacterNotFound)
+ }
+ if c.AccountID != accountID {
+ return nil, shortcuts.ServiceError(fiber.StatusNotFound, ErrCharacterNotFound)
+ }
+ return c, nil
+}
+
+func Create(accountID uuid.UUID, req characterTypes.CreateRequest) (*models.Character, *fiber.Error) {
+ r, err := realm.FindByID(req.RealmID)
+ if err != nil || r == nil {
+ return nil, shortcuts.ServiceError(fiber.StatusNotFound, ErrRealmNotFound)
+ }
+
+ if !r.IsOnline {
+ return nil, shortcuts.ServiceError(fiber.StatusServiceUnavailable, ErrRealmOffline)
+ }
+
+ c := &models.Character{
+ AccountID: accountID,
+ RealmID: req.RealmID,
+ Name: req.Name,
+ Race: req.Race,
+ StartingKingdom: req.StartingKingdom,
+ }
+
+ if err := character.Create(c); err != nil {
+ logger.Errorf(LogPrefix, CharacterCreateFailed, err)
+ return nil, shortcuts.ServiceError(fiber.StatusInternalServerError, fmt.Sprintf(CharacterCreateFailed, err))
+ }
+
+ logger.Successf(LogPrefix, CharacterCreated, c.Name)
+ return c, nil
+}
+
+func Delete(id uuid.UUID, accountID uuid.UUID) *fiber.Error {
+ c, err := character.FindByID(id)
+ if err != nil {
+ return shortcuts.ServiceError(fiber.StatusNotFound, ErrCharacterNotFound)
+ }
+
+ if c.AccountID != accountID {
+ return shortcuts.ServiceError(fiber.StatusNotFound, ErrCharacterNotFound)
+ }
+
+ if err := character.Delete(id); err != nil {
+ logger.Errorf(LogPrefix, CharacterDeleteFailed, err)
+ return shortcuts.ServiceError(fiber.StatusInternalServerError, fmt.Sprintf(CharacterDeleteFailed, err))
+ }
+
+ return nil
+}