199 lines
5.2 KiB
Go
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)
|
|
}
|