From d0356edef4dc0a14304b8890e8152911740ff87a Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Thu, 28 Nov 2024 18:00:50 +0200 Subject: Added position to networks --- internal/client/ui/core/core.go | 18 ++- internal/client/ui/core/state/state.go | 7 +- internal/data/models.go | 1 + internal/data/networks.sql.go | 148 --------------------- internal/data/users.sql.go | 37 ------ internal/data/users_networks.sql.go | 229 +++++++++++++++++++++++++++++++++ internal/packet/types.go | 5 +- internal/server/api/api.go | 6 +- 8 files changed, 257 insertions(+), 194 deletions(-) create mode 100644 internal/data/users_networks.sql.go (limited to 'internal') diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 737029f..98158b3 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -3,6 +3,8 @@ package core import ( "crypto/ed25519" "fmt" + "log" + "slices" "time" "github.com/charmbracelet/bubbles/spinner" @@ -138,8 +140,20 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd { return tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init()) case *packet.NetworksInfo: - for _, network := range msg.Networks { - state.State.Networks[network.ID] = network + if msg.Set { + state.State.Networks = msg.Networks + } else { + // state.State.Networks = append(state.State.Networks, msg.Networks...) + networks := state.State.Networks + networks = append(networks, msg.Networks...) + networks = slices.DeleteFunc(networks, func(network packet.FullNetwork) bool { + return slices.Contains(msg.RemoveNetworks, network.ID) + }) + slices.SortFunc(networks, func(a, b packet.FullNetwork) int { + return a.Position - b.Position + }) + log.Println(networks) + state.State.Networks = networks } case ui.QuitMsg: diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go index eeba245..e40cdc9 100644 --- a/internal/client/ui/core/state/state.go +++ b/internal/client/ui/core/state/state.go @@ -2,13 +2,10 @@ package state import ( "github.com/kyren223/eko/internal/packet" - "github.com/kyren223/eko/pkg/snowflake" ) type state struct { - Networks map[snowflake.ID]packet.FullNetwork + Networks []packet.FullNetwork } -var State state = state{ - Networks: make(map[snowflake.ID]packet.FullNetwork), -} +var State state = state{} diff --git a/internal/data/models.go b/internal/data/models.go index e6fac50..566d2ef 100644 --- a/internal/data/models.go +++ b/internal/data/models.go @@ -66,4 +66,5 @@ type UsersNetwork struct { IsMuted bool IsBanned bool BanReason *string + Position *int64 } diff --git a/internal/data/networks.sql.go b/internal/data/networks.sql.go index 70ee823..9adeeb8 100644 --- a/internal/data/networks.sql.go +++ b/internal/data/networks.sql.go @@ -64,51 +64,6 @@ func (q *Queries) DeleteNetwork(ctx context.Context, id snowflake.ID) error { return err } -const getNetworkBannedUsers = `-- name: GetNetworkBannedUsers :many -SELECT - users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted, - users_networks.ban_reason -FROM users_networks -JOIN users ON users.id = users_networks.user_id -WHERE users_networks.network_id = ? -` - -type GetNetworkBannedUsersRow struct { - User User - BanReason *string -} - -func (q *Queries) GetNetworkBannedUsers(ctx context.Context, networkID snowflake.ID) ([]GetNetworkBannedUsersRow, error) { - rows, err := q.db.QueryContext(ctx, getNetworkBannedUsers, networkID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []GetNetworkBannedUsersRow - for rows.Next() { - var i GetNetworkBannedUsersRow - if err := rows.Scan( - &i.User.ID, - &i.User.Name, - &i.User.PublicKey, - &i.User.Description, - &i.User.IsPublicDM, - &i.User.IsDeleted, - &i.BanReason, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getNetworkById = `-- name: GetNetworkById :one SELECT id, owner_id, name, icon, bg_hex_color, fg_hex_color, is_public FROM networks WHERE id = ? @@ -129,57 +84,6 @@ func (q *Queries) GetNetworkById(ctx context.Context, id snowflake.ID) (Network, return i, err } -const getNetworkMembers = `-- name: GetNetworkMembers :many -SELECT - users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted, - users_networks.joined_at, - users_networks.is_admin, - users_networks.is_muted -FROM users_networks -JOIN users ON users.id = users_networks.user_id -WHERE users_networks.network_id = ? AND is_member = true -` - -type GetNetworkMembersRow struct { - User User - JoinedAt string - IsAdmin bool - IsMuted bool -} - -func (q *Queries) GetNetworkMembers(ctx context.Context, networkID snowflake.ID) ([]GetNetworkMembersRow, error) { - rows, err := q.db.QueryContext(ctx, getNetworkMembers, networkID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []GetNetworkMembersRow - for rows.Next() { - var i GetNetworkMembersRow - if err := rows.Scan( - &i.User.ID, - &i.User.Name, - &i.User.PublicKey, - &i.User.Description, - &i.User.IsPublicDM, - &i.User.IsDeleted, - &i.JoinedAt, - &i.IsAdmin, - &i.IsMuted, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getPublicNetworks = `-- name: GetPublicNetworks :many SELECT id, owner_id, name, icon, bg_hex_color, fg_hex_color, is_public FROM networks WHERE is_public = true @@ -306,58 +210,6 @@ func (q *Queries) SetNetworkName(ctx context.Context, arg SetNetworkNameParams) return i, err } -const setNetworkUser = `-- name: SetNetworkUser :one -INSERT INTO users_networks ( - user_id, network_id, - is_member, is_admin, is_muted, - is_banned, ban_reason -) VALUES ( - ?1, ?2, - ?3, ?4, ?5, - ?6, ?7 -) -ON CONFLICT DO -UPDATE SET - is_member = ?3, is_admin = ?4, is_muted = ?5, - is_banned = ?6, ban_reason = ?7 -WHERE user_id = ?1 AND network_id = ?2 -RETURNING user_id, network_id, joined_at, is_member, is_admin, is_muted, is_banned, ban_reason -` - -type SetNetworkUserParams struct { - UserID snowflake.ID - NetworkID snowflake.ID - IsMember bool - IsAdmin bool - IsMuted bool - IsBanned bool - BanReason *string -} - -func (q *Queries) SetNetworkUser(ctx context.Context, arg SetNetworkUserParams) (UsersNetwork, error) { - row := q.db.QueryRowContext(ctx, setNetworkUser, - arg.UserID, - arg.NetworkID, - arg.IsMember, - arg.IsAdmin, - arg.IsMuted, - arg.IsBanned, - arg.BanReason, - ) - var i UsersNetwork - err := row.Scan( - &i.UserID, - &i.NetworkID, - &i.JoinedAt, - &i.IsMember, - &i.IsAdmin, - &i.IsMuted, - &i.IsBanned, - &i.BanReason, - ) - return i, err -} - const transferNetwork = `-- name: TransferNetwork :one UPDATE networks SET owner_id = ? diff --git a/internal/data/users.sql.go b/internal/data/users.sql.go index 562ab35..33eab3f 100644 --- a/internal/data/users.sql.go +++ b/internal/data/users.sql.go @@ -109,43 +109,6 @@ func (q *Queries) GetUserByPublicKey(ctx context.Context, publicKey ed25519.Publ return i, err } -const getUserNetworks = `-- name: GetUserNetworks :many -SELECT networks.id, networks.owner_id, networks.name, networks.icon, networks.bg_hex_color, networks.fg_hex_color, networks.is_public FROM networks -JOIN users_networks ON networks.id = users_networks.network_id -WHERE users_networks.user_id = ? -` - -func (q *Queries) GetUserNetworks(ctx context.Context, userID snowflake.ID) ([]Network, error) { - rows, err := q.db.QueryContext(ctx, getUserNetworks, userID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Network - for rows.Next() { - var i Network - if err := rows.Scan( - &i.ID, - &i.OwnerID, - &i.Name, - &i.Icon, - &i.BgHexColor, - &i.FgHexColor, - &i.IsPublic, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const setUserDescription = `-- name: SetUserDescription :one UPDATE users SET description = ? diff --git a/internal/data/users_networks.sql.go b/internal/data/users_networks.sql.go new file mode 100644 index 0000000..4c1d84f --- /dev/null +++ b/internal/data/users_networks.sql.go @@ -0,0 +1,229 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: users_networks.sql + +package data + +import ( + "context" + + "github.com/kyren223/eko/pkg/snowflake" +) + +const getNetworkBannedUsers = `-- name: GetNetworkBannedUsers :many +SELECT + users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted, + users_networks.ban_reason +FROM users_networks +JOIN users ON users.id = users_networks.user_id +WHERE users_networks.network_id = ? +` + +type GetNetworkBannedUsersRow struct { + User User + BanReason *string +} + +func (q *Queries) GetNetworkBannedUsers(ctx context.Context, networkID snowflake.ID) ([]GetNetworkBannedUsersRow, error) { + rows, err := q.db.QueryContext(ctx, getNetworkBannedUsers, networkID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetNetworkBannedUsersRow + for rows.Next() { + var i GetNetworkBannedUsersRow + if err := rows.Scan( + &i.User.ID, + &i.User.Name, + &i.User.PublicKey, + &i.User.Description, + &i.User.IsPublicDM, + &i.User.IsDeleted, + &i.BanReason, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getNetworkMembers = `-- name: GetNetworkMembers :many +SELECT + users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted, + users_networks.joined_at, + users_networks.is_admin, + users_networks.is_muted +FROM users_networks +JOIN users ON users.id = users_networks.user_id +WHERE users_networks.network_id = ? AND is_member = true +` + +type GetNetworkMembersRow struct { + User User + JoinedAt string + IsAdmin bool + IsMuted bool +} + +func (q *Queries) GetNetworkMembers(ctx context.Context, networkID snowflake.ID) ([]GetNetworkMembersRow, error) { + rows, err := q.db.QueryContext(ctx, getNetworkMembers, networkID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetNetworkMembersRow + for rows.Next() { + var i GetNetworkMembersRow + if err := rows.Scan( + &i.User.ID, + &i.User.Name, + &i.User.PublicKey, + &i.User.Description, + &i.User.IsPublicDM, + &i.User.IsDeleted, + &i.JoinedAt, + &i.IsAdmin, + &i.IsMuted, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getUserNetworks = `-- name: GetUserNetworks :many +SELECT networks.id, networks.owner_id, networks.name, networks.icon, networks.bg_hex_color, networks.fg_hex_color, networks.is_public, users_networks.position FROM networks +JOIN users_networks ON networks.id = users_networks.network_id +WHERE users_networks.user_id = ? +ORDER BY users_networks.position +` + +type GetUserNetworksRow struct { + Network Network + Position *int64 +} + +func (q *Queries) GetUserNetworks(ctx context.Context, userID snowflake.ID) ([]GetUserNetworksRow, error) { + rows, err := q.db.QueryContext(ctx, getUserNetworks, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetUserNetworksRow + for rows.Next() { + var i GetUserNetworksRow + if err := rows.Scan( + &i.Network.ID, + &i.Network.OwnerID, + &i.Network.Name, + &i.Network.Icon, + &i.Network.BgHexColor, + &i.Network.FgHexColor, + &i.Network.IsPublic, + &i.Position, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const setNetworkUser = `-- name: SetNetworkUser :one +INSERT INTO users_networks ( + user_id, network_id, + is_member, is_admin, is_muted, + is_banned, ban_reason, position +) VALUES ( + ?1, ?2, + ?3, ?4, ?5, + ?6, ?7, + CASE + WHEN ?3 = false THEN NULL + ELSE (SELECT COUNT(*) FROM users_networks WHERE user_id = ?1) + END +) +ON CONFLICT DO +UPDATE SET + is_member = EXCLUDED.is_member, is_admin = EXCLUDED.is_admin, is_muted = EXCLUDED.is_muted, + is_banned = EXCLUDED.is_banned, ban_reason = EXCLUDED.ban_reason, position = EXCLUDED.position +WHERE user_id = EXCLUDED.user_id AND network_id = EXCLUDED.network_id +RETURNING user_id, network_id, joined_at, is_member, is_admin, is_muted, is_banned, ban_reason, position +` + +type SetNetworkUserParams struct { + UserID snowflake.ID + NetworkID snowflake.ID + IsMember bool + IsAdmin bool + IsMuted bool + IsBanned bool + BanReason *string +} + +func (q *Queries) SetNetworkUser(ctx context.Context, arg SetNetworkUserParams) (UsersNetwork, error) { + row := q.db.QueryRowContext(ctx, setNetworkUser, + arg.UserID, + arg.NetworkID, + arg.IsMember, + arg.IsAdmin, + arg.IsMuted, + arg.IsBanned, + arg.BanReason, + ) + var i UsersNetwork + err := row.Scan( + &i.UserID, + &i.NetworkID, + &i.JoinedAt, + &i.IsMember, + &i.IsAdmin, + &i.IsMuted, + &i.IsBanned, + &i.BanReason, + &i.Position, + ) + return i, err +} + +const swapUserNetworks = `-- name: SwapUserNetworks :exec +UPDATE users_networks SET + position = CASE + WHEN position = ?1 THEN ?2 + WHEN position = ?2 THEN ?1 + END +WHERE user_id = ?3 AND position IN (?1, ?2) +` + +type SwapUserNetworksParams struct { + Pos1 *int64 + Pos2 *int64 + UserID snowflake.ID +} + +func (q *Queries) SwapUserNetworks(ctx context.Context, arg SwapUserNetworksParams) error { + _, err := q.db.ExecContext(ctx, swapUserNetworks, arg.Pos1, arg.Pos2, arg.UserID) + return err +} diff --git a/internal/packet/types.go b/internal/packet/types.go index 897d4e7..e5dd88a 100644 --- a/internal/packet/types.go +++ b/internal/packet/types.go @@ -69,10 +69,13 @@ type FullNetwork struct { data.Network Frequencies []data.Frequency Members []data.GetNetworkMembersRow + Position int } type NetworksInfo struct { - Networks []FullNetwork + Networks []FullNetwork + RemoveNetworks []snowflake.ID + Set bool } func (m *NetworksInfo) Type() PacketType { diff --git a/internal/server/api/api.go b/internal/server/api/api.go index c67f906..53ef76a 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -168,6 +168,7 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C IsAdmin: networkUser.IsAdmin, IsMuted: networkUser.IsMuted, }}, + Position: int(*networkUser.Position), } return &packet.NetworksInfo{ Networks: []packet.FullNetwork{fullNetwork}, @@ -191,7 +192,9 @@ func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload return nil, err } - for _, network := range networks { + for _, userNetwork := range networks { + network := userNetwork.Network + position := int(*userNetwork.Position) frequencies, err := qtx.GetNetworkFrequencies(ctx, network.ID) if err != nil { return nil, err @@ -206,6 +209,7 @@ func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload Network: network, Frequencies: frequencies, Members: members, + Position: position, }) } -- cgit v1.3.1