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) }