Files
17th-UnitTracker-API/api/ops/member.go
2024-02-28 11:14:48 -08:00

199 lines
5.2 KiB
Go

package ops
import (
"context"
"fmt"
"time"
"gitea.iceberg-gaming.com/17th-Ranger-Battalion-ORG/17th-UnitTracker-API/db"
"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 {
ID int `json:"id"`
Name string `json:"name"`
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"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Deleted null.Int `json:"deleted"`
Remarks null.String `json:"remarks"`
}
/*
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;
*/
// GetMembers returns a list of all members
func GetMembers(c echo.Context) error {
members := []Member{}
ctx, cancel := context.WithTimeout(
context.Background(),
2*time.Second,
)
defer cancel()
rows, err := db.ActiveDB.QueryContext(
ctx,
"SELECT * FROM members",
)
if err != nil {
return c.JSON(500, map[string]interface{}{
"error": err.Error(),
})
}
if ctx.Err() == context.DeadlineExceeded {
return c.JSON(500, map[string]interface{}{
"error": "request timed out",
})
}
// scan the rows into the members slice
for rows.Next() {
var m Member
err = rows.Scan(
&m.ID,
&m.Name,
&m.Timezone,
&m.Email,
&m.Website,
&m.GuildedID,
&m.SteamID64,
&m.TeamspeakUID,
&m.SteamProfileName,
&m.DiscordID,
&m.DiscordUsername,
&m.Aliases,
&m.CreatedAt,
&m.UpdatedAt,
&m.Deleted,
&m.Remarks,
)
if err != nil {
return c.JSON(500, map[string]interface{}{
"error": err.Error(),
})
}
members = append(members, m)
}
return c.JSON(200, members)
}
// GetMember returns a single member by ID
func GetMember(c echo.Context) error {
id := c.Param("id")
if id == "" {
return fmt.Errorf("id is required")
}
ctx, cancel := context.WithTimeout(
context.Background(),
2*time.Second,
)
defer cancel()
returnMember := Member{}
err := db.ActiveDB.QueryRowContext(
ctx,
"SELECT * FROM members WHERE id = ?",
id,
).Scan(
&returnMember.ID,
&returnMember.Name,
&returnMember.Timezone,
&returnMember.Email,
&returnMember.Website,
&returnMember.GuildedID,
&returnMember.SteamID64,
&returnMember.TeamspeakUID,
&returnMember.SteamProfileName,
&returnMember.DiscordID,
&returnMember.DiscordUsername,
&returnMember.Aliases,
&returnMember.CreatedAt,
&returnMember.UpdatedAt,
&returnMember.Deleted,
&returnMember.Remarks,
)
if err != nil {
return c.JSON(500, map[string]interface{}{
"error": err.Error(),
})
}
if ctx.Err() == context.DeadlineExceeded {
return c.JSON(500, map[string]interface{}{
"error": "request timed out",
})
}
return c.JSON(200, returnMember)
}