220 lines
5.1 KiB
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
|
|
}
|