copy some gorm from data-service
This commit is contained in:
parent
ca5779a56b
commit
f0bd6ba53a
132
internal/controller/maps.go
Normal file
132
internal/controller/maps.go
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
"git.itzana.me/strafesnet/go-grpc/maps"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Maps struct {
|
||||||
|
*maps.UnimplementedMapsServiceServer
|
||||||
|
Store datastore.Datastore
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Get(ctx context.Context, message *maps.IdMessage) (*maps.MapResponse, error) {
|
||||||
|
item, err := m.Store.Maps().Get(ctx, message.GetID())
|
||||||
|
if err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, "map does not exit")
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get map:").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &maps.MapResponse{
|
||||||
|
ID: item.ID,
|
||||||
|
DisplayName: item.DisplayName,
|
||||||
|
Creator: item.Creator,
|
||||||
|
GameID: item.GameID,
|
||||||
|
Date: item.Date.Unix(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) GetList(ctx context.Context, list *maps.IdList) (*maps.MapList, error) {
|
||||||
|
items, err := m.Store.Maps().GetList(ctx, list.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get maps").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp maps.MapList
|
||||||
|
for i := 0; i < len(items); i++ {
|
||||||
|
resp.Maps = append(resp.Maps, &maps.MapResponse{
|
||||||
|
ID: items[i].ID,
|
||||||
|
DisplayName: items[i].DisplayName,
|
||||||
|
Creator: items[i].Creator,
|
||||||
|
GameID: items[i].GameID,
|
||||||
|
Date: items[i].Date.Unix(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Update(ctx context.Context, request *maps.MapRequest) (*maps.NullResponse, error) {
|
||||||
|
updates := datastore.Optional()
|
||||||
|
updates.AddNotNil("display_name", request.DisplayName)
|
||||||
|
updates.AddNotNil("creator", request.Creator)
|
||||||
|
updates.AddNotNil("game_id", request.GameID)
|
||||||
|
if request.Date != nil {
|
||||||
|
updates.AddNotNil("date", time.Unix(request.GetDate(), 0))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := m.Store.Maps().Update(ctx, request.GetID(), updates); err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, "map does not exit")
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to update map:").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &maps.NullResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Create(ctx context.Context, request *maps.MapRequest) (*maps.IdMessage, error) {
|
||||||
|
item, err := m.Store.Maps().Create(ctx, model.Map{
|
||||||
|
ID: request.GetID(),
|
||||||
|
DisplayName: request.GetDisplayName(),
|
||||||
|
Creator: request.GetCreator(),
|
||||||
|
GameID: request.GetGameID(),
|
||||||
|
Date: time.Unix(request.GetDate(), 0),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to create map:").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &maps.IdMessage{ID: item.ID}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Delete(ctx context.Context, message *maps.IdMessage) (*maps.NullResponse, error) {
|
||||||
|
if err := m.Store.Maps().Delete(ctx, message.GetID()); err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, "map does not exit")
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to delete map:").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &maps.NullResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) List(ctx context.Context, request *maps.ListRequest) (*maps.MapList, error) {
|
||||||
|
filter := datastore.Optional()
|
||||||
|
fmt.Println(request)
|
||||||
|
if request.Filter != nil {
|
||||||
|
filter.AddNotNil("display_name", request.GetFilter().DisplayName)
|
||||||
|
filter.AddNotNil("creator", request.GetFilter().Creator)
|
||||||
|
filter.AddNotNil("game_id", request.GetFilter().GameID)
|
||||||
|
}
|
||||||
|
|
||||||
|
items, err := m.Store.Maps().List(ctx, filter, model.Page{
|
||||||
|
Number: request.GetPage().GetNumber(),
|
||||||
|
Size: request.GetPage().GetSize(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get maps:").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp maps.MapList
|
||||||
|
for i := 0; i < len(items); i++ {
|
||||||
|
resp.Maps = append(resp.Maps, &maps.MapResponse{
|
||||||
|
ID: items[i].ID,
|
||||||
|
DisplayName: items[i].DisplayName,
|
||||||
|
Creator: items[i].Creator,
|
||||||
|
GameID: items[i].GameID,
|
||||||
|
Date: items[i].Date.Unix(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &resp, nil
|
||||||
|
}
|
117
internal/controller/users.go
Normal file
117
internal/controller/users.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
"git.itzana.me/strafesnet/go-grpc/users"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Users struct {
|
||||||
|
*users.UnimplementedUsersServiceServer
|
||||||
|
Store datastore.Datastore
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Get(ctx context.Context, request *users.IdMessage) (*users.UserResponse, error) {
|
||||||
|
ur, err := u.Store.Users().Get(ctx, request.ID)
|
||||||
|
if err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, err.Error())
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get user").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &users.UserResponse{
|
||||||
|
ID: ur.ID,
|
||||||
|
Username: ur.Username,
|
||||||
|
StateID: ur.StateID,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) GetList(ctx context.Context, list *users.IdList) (*users.UserList, error) {
|
||||||
|
uList, err := u.Store.Users().GetList(ctx, list.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get users").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp users.UserList
|
||||||
|
for i := 0; i < len(uList); i++ {
|
||||||
|
resp.Users = append(resp.Users, &users.UserResponse{
|
||||||
|
ID: uList[i].ID,
|
||||||
|
Username: uList[i].Username,
|
||||||
|
StateID: uList[i].StateID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Update(ctx context.Context, request *users.UserRequest) (*users.NullResponse, error) {
|
||||||
|
updates := datastore.Optional()
|
||||||
|
updates.AddNotNil("state_id", request.StateID)
|
||||||
|
updates.AddNotNil("username", request.Username)
|
||||||
|
|
||||||
|
if err := u.Store.Users().Update(ctx, request.GetID(), updates); err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, err.Error())
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to update user").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &users.NullResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Create(ctx context.Context, request *users.UserRequest) (*users.IdMessage, error) {
|
||||||
|
us, err := u.Store.Users().Create(ctx, model.User{
|
||||||
|
ID: request.GetID(),
|
||||||
|
Username: request.GetUsername(),
|
||||||
|
StateID: request.GetStateID(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to create user").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &users.IdMessage{ID: us.ID}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Delete(ctx context.Context, request *users.IdMessage) (*users.NullResponse, error) {
|
||||||
|
if err := u.Store.Users().Delete(ctx, request.GetID()); err != nil {
|
||||||
|
if err == datastore.ErrNotExist {
|
||||||
|
return nil, status.Error(codes.NotFound, err.Error())
|
||||||
|
}
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to delete user").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &users.NullResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) List(ctx context.Context, request *users.ListRequest) (*users.UserList, error) {
|
||||||
|
filters := datastore.Optional()
|
||||||
|
if request.Filter != nil {
|
||||||
|
filters.AddNotNil("id", request.GetFilter().ID)
|
||||||
|
filters.AddNotNil("state_id", request.GetFilter().StateID)
|
||||||
|
filters.AddNotNil("username", request.GetFilter().Username)
|
||||||
|
}
|
||||||
|
|
||||||
|
uList, err := u.Store.Users().List(ctx, filters, model.Page{
|
||||||
|
Number: request.GetPage().GetNumber(),
|
||||||
|
Size: request.GetPage().GetSize(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, errors.Wrap(err, "failed to get filtered users").Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var uResp users.UserList
|
||||||
|
for i := 0; i < len(uList); i++ {
|
||||||
|
uResp.Users = append(uResp.Users, &users.UserResponse{
|
||||||
|
ID: uList[i].ID,
|
||||||
|
Username: uList[i].Username,
|
||||||
|
StateID: uList[i].StateID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &uResp, nil
|
||||||
|
}
|
94
internal/datastore/datastore.go
Normal file
94
internal/datastore/datastore.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package datastore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrNotExist = errors.New("resource does not exist")
|
||||||
|
)
|
||||||
|
|
||||||
|
type Datastore interface {
|
||||||
|
Times() Times
|
||||||
|
Users() Users
|
||||||
|
Bots() Bots
|
||||||
|
Maps() Maps
|
||||||
|
Events() Events
|
||||||
|
Servers() Servers
|
||||||
|
Transactions() Transactions
|
||||||
|
Ranks() Ranks
|
||||||
|
}
|
||||||
|
|
||||||
|
type Times interface {
|
||||||
|
Get(ctx context.Context, id int64) (model.Time, error)
|
||||||
|
Create(ctx context.Context, time model.Time) (model.Time, error)
|
||||||
|
Update(ctx context.Context, id int64, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id int64) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, blacklisted bool, page model.Page, sort uint32) (int64, []model.Time, error)
|
||||||
|
Rank(ctx context.Context, id int64) (int64, error)
|
||||||
|
DistinctStylePairs(ctx context.Context) ([]model.Time, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Users interface {
|
||||||
|
Get(ctx context.Context, id int64) (model.User, error)
|
||||||
|
GetList(ctx context.Context, id []int64) ([]model.User, error)
|
||||||
|
Create(ctx context.Context, user model.User) (model.User, error)
|
||||||
|
Update(ctx context.Context, id int64, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id int64) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.User, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Bots interface {
|
||||||
|
Get(ctx context.Context, id int64) (model.Bot, error)
|
||||||
|
GetList(ctx context.Context, id []int64) ([]model.Bot, error)
|
||||||
|
Create(ctx context.Context, bot model.Bot) (model.Bot, error)
|
||||||
|
Update(ctx context.Context, id int64, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id int64) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.Bot, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Maps interface {
|
||||||
|
Get(ctx context.Context, id int64) (model.Map, error)
|
||||||
|
GetList(ctx context.Context, id []int64) ([]model.Map, error)
|
||||||
|
Create(ctx context.Context, time model.Map) (model.Map, error)
|
||||||
|
Update(ctx context.Context, id int64, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id int64) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.Map, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Events interface {
|
||||||
|
Latest(ctx context.Context, date int64, page model.Page) ([]model.Event, error)
|
||||||
|
Create(ctx context.Context, event model.Event) (model.Event, error)
|
||||||
|
Clean(ctx context.Context) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type Servers interface {
|
||||||
|
Get(ctx context.Context, id string) (model.Server, error)
|
||||||
|
Create(ctx context.Context, server model.Server) (model.Server, error)
|
||||||
|
Update(ctx context.Context, id string, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id string) error
|
||||||
|
DeleteByLastUpdated(ctx context.Context, date time.Time) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.Server, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Transactions interface {
|
||||||
|
Balance(ctx context.Context, user int64) (int64, error)
|
||||||
|
Get(ctx context.Context, id string) (model.Transaction, error)
|
||||||
|
Create(ctx context.Context, transaction model.Transaction) (model.Transaction, error)
|
||||||
|
Update(ctx context.Context, id string, values OptionalMap) error
|
||||||
|
Delete(ctx context.Context, id string) error
|
||||||
|
List(ctx context.Context, filters OptionalMap, page model.Page) ([]model.Transaction, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Ranks interface {
|
||||||
|
Delete(ctx context.Context, id int64) error
|
||||||
|
Get(ctx context.Context, user int64, style, game, mode int32, state []int32) (model.Rank, error)
|
||||||
|
List(ctx context.Context, style, game, mode int32, sort int64, state []int32, page model.Page) ([]model.Rank, error)
|
||||||
|
UpdateRankCalc(ctx context.Context) error
|
||||||
|
UpdateAll(ctx context.Context, style, game, mode int32) error
|
||||||
|
UpdateUsers(ctx context.Context, style, game, mode int32, users []int) error
|
||||||
|
}
|
28
internal/datastore/filter.go
Normal file
28
internal/datastore/filter.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package datastore
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
type OptionalMap struct {
|
||||||
|
filter map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Optional() OptionalMap {
|
||||||
|
return OptionalMap{filter: map[string]interface{}{}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q OptionalMap) Add(column string, value interface{}) OptionalMap {
|
||||||
|
q.filter[column] = value
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q OptionalMap) AddNotNil(column string, value interface{}) OptionalMap {
|
||||||
|
if value == nil || (reflect.ValueOf(value).Kind() == reflect.Ptr && reflect.ValueOf(value).IsNil()) {
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
q.Add(column, value)
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q OptionalMap) Map() map[string]interface{} {
|
||||||
|
return q.filter
|
||||||
|
}
|
48
internal/datastore/gormstore/db.go
Normal file
48
internal/datastore/gormstore/db.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package gormstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
"git.itzana.me/strafesnet/utils/logger"
|
||||||
|
"github.com/eko/gocache/lib/v4/cache"
|
||||||
|
gocache_store "github.com/eko/gocache/store/go_cache/v4"
|
||||||
|
gocache "github.com/patrickmn/go-cache"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"gorm.io/driver/postgres"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(migrate bool) (datastore.Datastore, error) {
|
||||||
|
db, err := gorm.Open(postgres.Open(fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s", os.Getenv("PG_HOST"), os.Getenv("PG_USER"), os.Getenv("PG_PASS"), os.Getenv("PG_DB"), os.Getenv("PG_PORT"))), &gorm.Config{
|
||||||
|
Logger: logger.New()})
|
||||||
|
if err != nil {
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"PG_USER": os.Getenv("PG_USER"),
|
||||||
|
"PG_HOST": os.Getenv("PG_HOST"),
|
||||||
|
"PG_PORT": os.Getenv("PG_PORT"),
|
||||||
|
"PG_DB": os.Getenv("PG_DB"),
|
||||||
|
"error": err,
|
||||||
|
}).Errorln("failed to connect to database")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlDB, err := db.DB()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
sqlDB.SetMaxIdleConns(10)
|
||||||
|
sqlDB.SetMaxOpenConns(25)
|
||||||
|
|
||||||
|
if migrate {
|
||||||
|
if err := db.AutoMigrate(&model.Time{}, &model.User{}, &model.Bot{}, &model.Map{}, &model.Event{}, &model.Server{}, &model.Transaction{}, &model.Rank{}, &model.RankCalc{}); err != nil {
|
||||||
|
log.WithField("error", err).Errorln("database migration failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Gormstore{db, cache.New[[]byte](gocache_store.NewGoCache(gocache.New(5*time.Minute, 10*time.Minute)))}, nil
|
||||||
|
}
|
44
internal/datastore/gormstore/gormstore.go
Normal file
44
internal/datastore/gormstore/gormstore.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package gormstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"github.com/eko/gocache/lib/v4/cache"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Gormstore struct {
|
||||||
|
db *gorm.DB
|
||||||
|
cache *cache.Cache[[]byte]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Times() datastore.Times {
|
||||||
|
return &Times{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Users() datastore.Users {
|
||||||
|
return &Users{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Bots() datastore.Bots {
|
||||||
|
return &Bots{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Maps() datastore.Maps {
|
||||||
|
return &Maps{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Events() datastore.Events {
|
||||||
|
return &Events{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Servers() datastore.Servers {
|
||||||
|
return &Servers{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Transactions() datastore.Transactions {
|
||||||
|
return &Transactions{db: g.db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Gormstore) Ranks() datastore.Ranks {
|
||||||
|
return &Ranks{db: g.db, cache: g.cache}
|
||||||
|
}
|
72
internal/datastore/gormstore/maps.go
Normal file
72
internal/datastore/gormstore/maps.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package gormstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Maps struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Get(ctx context.Context, id int64) (model.Map, error) {
|
||||||
|
var smap model.Map
|
||||||
|
if err := m.db.WithContext(ctx).First(&smap, id).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return smap, datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return smap, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return smap, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) GetList(ctx context.Context, id []int64) ([]model.Map, error) {
|
||||||
|
var mapList []model.Map
|
||||||
|
if err := m.db.WithContext(ctx).Find(&mapList, "id IN ?", id).Error; err != nil {
|
||||||
|
return mapList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return mapList, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Create(ctx context.Context, smap model.Map) (model.Map, error) {
|
||||||
|
if err := m.db.WithContext(ctx).Create(&smap).Error; err != nil {
|
||||||
|
return smap, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return smap, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Update(ctx context.Context, id int64, values datastore.OptionalMap) error {
|
||||||
|
if err := m.db.WithContext(ctx).Model(&model.Map{}).Where("id = ?", id).Updates(values.Map()).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) Delete(ctx context.Context, id int64) error {
|
||||||
|
if err := m.db.WithContext(ctx).Delete(&model.Map{}, id).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Maps) List(ctx context.Context, filters datastore.OptionalMap, page model.Page) ([]model.Map, error) {
|
||||||
|
var maps []model.Map
|
||||||
|
if err := m.db.WithContext(ctx).Where(filters.Map()).Offset(int((page.Number - 1) * page.Size)).Limit(int(page.Size)).Find(&maps).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return maps, nil
|
||||||
|
}
|
72
internal/datastore/gormstore/users.go
Normal file
72
internal/datastore/gormstore/users.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package gormstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/datastore"
|
||||||
|
"git.itzana.me/strafesnet/data-service/internal/model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Users struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Get(ctx context.Context, id int64) (model.User, error) {
|
||||||
|
var user model.User
|
||||||
|
if err := u.db.WithContext(ctx).First(&user, id).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return user, datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return user, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) GetList(ctx context.Context, id []int64) ([]model.User, error) {
|
||||||
|
var user []model.User
|
||||||
|
if err := u.db.WithContext(ctx).Find(&user, "id IN ?", id).Error; err != nil {
|
||||||
|
return user, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Create(ctx context.Context, user model.User) (model.User, error) {
|
||||||
|
if err := u.db.WithContext(ctx).Create(&user).Error; err != nil {
|
||||||
|
return user, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Update(ctx context.Context, id int64, values datastore.OptionalMap) error {
|
||||||
|
if err := u.db.WithContext(ctx).Model(&model.User{}).Where("id = ?", id).Updates(values.Map()).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) Delete(ctx context.Context, id int64) error {
|
||||||
|
if err := u.db.WithContext(ctx).Delete(&model.User{}, id).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
return datastore.ErrNotExist
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u Users) List(ctx context.Context, filters datastore.OptionalMap, page model.Page) ([]model.User, error) {
|
||||||
|
var users []model.User
|
||||||
|
if err := u.db.WithContext(ctx).Where(filters.Map()).Offset(int((page.Number - 1) * page.Size)).Limit(int(page.Size)).Find(&users).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return users, nil
|
||||||
|
}
|
11
internal/model/map.go
Normal file
11
internal/model/map.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Map struct {
|
||||||
|
ID int64
|
||||||
|
DisplayName string
|
||||||
|
Creator string
|
||||||
|
GameID int32
|
||||||
|
Date time.Time
|
||||||
|
}
|
6
internal/model/page.go
Normal file
6
internal/model/page.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type Page struct {
|
||||||
|
Number int32
|
||||||
|
Size int32
|
||||||
|
}
|
7
internal/model/user.go
Normal file
7
internal/model/user.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
ID int64
|
||||||
|
Username string `gorm:"not null"`
|
||||||
|
StateID int32 `gorm:"not null;default:0"`
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user