Files
17th-UnitTracker-API/api/db/member.go

220 lines
5.1 KiB
Go

package db
import (
"context"
"github.com/labstack/echo/v4"
"gopkg.in/guregu/null.v3"
)
/*
DDL
CREATE TABLE `members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`timezone` varchar(5) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`website` varchar(240) DEFAULT NULL,
`guilded_id` varchar(10) DEFAULT NULL,
`steam_id_64` varchar(17) DEFAULT NULL,
`teamspeak_uid` varchar(32) DEFAULT NULL,
`steam_profile_name` varchar(32) DEFAULT NULL,
`discord_id` varchar(20) DEFAULT NULL,
`discord_username` varchar(32) DEFAULT NULL,
`aliases` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`aliases`)),
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`deleted` tinyint(4) DEFAULT NULL,
`remarks` text DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `steamId64` (`steam_id_64`) USING BTREE,
UNIQUE KEY `discordId` (`discord_id`) USING BTREE,
UNIQUE KEY `guilded_id` (`guilded_id`)
) ENGINE=InnoDB AUTO_INCREMENT=186 DEFAULT CHARSET=utf8mb4;
*/
// Member is a struct that represents a member
type Member struct {
ObjectBase
Name string `json:"name"`
Company null.String `json:"company"`
Timezone null.String `json:"timezone"`
Email null.String `json:"email"`
Website null.String `json:"website"`
GuildedID null.String `json:"guilded_id"`
SteamID64 null.String `json:"steam_id_64"`
TeamspeakUID null.String `json:"teamspeak_uid"`
SteamProfileName null.String `json:"steam_profile_name"`
DiscordID null.String `json:"discord_id"`
DiscordUsername null.String `json:"discord_username"`
Aliases null.String `json:"aliases"`
Remarks null.String `json:"remarks"`
Rank Rank `json:"rank" gorm:"references:ID; foreignkey:RankID"`
RankID int `json:"rank_id"`
Awards []Award `json:"awards" gorm:"many2many:member_awards;"`
}
// Get one by id
func (m *Member) GetByID(ctx context.Context, id int) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).First(m, id).Error
if err != nil {
return err
}
return nil
}
// Get all
func (m *Member) GetAll(ctx context.Context) ([]Member, error) {
var members []Member
db, err := GetDB()
if err != nil {
return nil, err
}
// Search by provided struct
err = db.WithContext(ctx).
Model(m).Where(m).Find(&members).Error
if err != nil {
return nil, err
}
return members, nil
}
// Create a new member
func (m *Member) Create(ctx context.Context, c echo.Context) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Create(m).Error
if err != nil {
return err
}
return nil
}
// Update a member
func (m *Member) Update(ctx context.Context, c echo.Context) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Save(m).Error
if err != nil {
return err
}
return nil
}
// Delete a member
func (m *Member) Delete(ctx context.Context, c echo.Context) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Delete(m).Error
if err != nil {
return err
}
return nil
}
// Get by name
func (m *Member) GetByName(ctx context.Context, name string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("name = ?", name).First(m).Error
if err != nil {
return err
}
return nil
}
// Get by steam id
func (m *Member) GetBySteamID(ctx context.Context, steamID string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("steam_id_64 = ?", steamID).First(m).Error
if err != nil {
return err
}
return nil
}
// Get by discord id
func (m *Member) GetByDiscordID(ctx context.Context, discordID string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("discord_id = ?", discordID).First(m).Error
if err != nil {
return err
}
return nil
}
// Get by guilded id
func (m *Member) GetByGuildedID(ctx context.Context, guildedID string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("guilded_id = ?", guildedID).First(m).Error
if err != nil {
return err
}
return nil
}
// Get by teamspeak uid
func (m *Member) GetByTeamspeakUID(ctx context.Context, teamspeakUID string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("teamspeak_uid = ?", teamspeakUID).First(m).Error
if err != nil {
return err
}
return nil
}
// Get by email
func (m *Member) GetByEmail(ctx context.Context, email string) error {
db, err := GetDB()
if err != nil {
return err
}
err = db.WithContext(ctx).Where("email = ?", email).First(m).Error
if err != nil {
return err
}
return nil
}
// Get awards a member has
func (m *Member) GetAwards(ctx context.Context) ([]Award, error) {
db, err := GetDB()
if err != nil {
return nil, err
}
err = db.WithContext(ctx).Model(m).Association("Awards").Find(&m.Awards)
if err != nil {
return nil, err
}
return m.Awards, nil
}