diff options
| author | Kyren223 <Kyren223@proton.me> | 2024-12-01 10:09:21 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2024-12-01 10:09:21 +0200 |
| commit | 78a38f508e7b9d2389c9c422c2d164b9059b03f8 (patch) | |
| tree | 67550791d99597eaa6ab50334ccc880f06a8de17 /internal/server | |
| parent | 94166da109cf19ce48311d07aa67875fcb85f178 (diff) | |
Implemented frequency creation, BROKEN right now
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/api/api.go | 97 | ||||
| -rw-r--r-- | internal/server/server.go | 3 |
2 files changed, 84 insertions, 16 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go index 9c6474e..4370d90 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -15,7 +15,10 @@ import ( "github.com/kyren223/eko/pkg/snowflake" ) -var internalError = packet.Error{Error: "internal server error"} +var ( + ErrInternalError = packet.Error{Error: "internal server error"} + ErrPermissionDenied = packet.Error{Error: "permission denied"} +) func SendMessage(ctx context.Context, sess *session.Session, request *packet.SendMessage) packet.Payload { if (request.ReceiverID != nil) == (request.FrequencyID != nil) { @@ -37,7 +40,7 @@ func SendMessage(ctx context.Context, sess *session.Session, request *packet.Sen }) if err != nil { log.Println(sess.Addr(), "database error:", err, "in SendMessage") - return &internalError + return &ErrInternalError } return &packet.MessagesInfo{Messages: []data.Message{message}} @@ -88,8 +91,7 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C if len(request.Icon) > packet.MaxIconBytes { return &packet.Error{Error: fmt.Sprintf( - "icon is too large, must be smaller than %v bytes", - packet.MaxIconBytes, + "exceeded allowed icon size in bytes: %v", packet.MaxIconBytes, )} } @@ -103,7 +105,7 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C tx, err := db.BeginTx(ctx, nil) if err != nil { log.Println("database error:", err) - return &internalError + return &ErrInternalError } defer tx.Rollback() //nolint @@ -121,7 +123,7 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C }) if err != nil { log.Println("database error 1:", err) - return &internalError + return &ErrInternalError } frequency, err := qtx.CreateFrequency(ctx, data.CreateFrequencyParams{ @@ -133,7 +135,7 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C }) if err != nil { log.Println("database error 2:", err) - return &internalError + return &ErrInternalError } networkUser, err := qtx.SetNetworkUser(ctx, data.SetNetworkUserParams{ @@ -147,19 +149,19 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C }) if err != nil { log.Println("database error 3:", err) - return &internalError + return &ErrInternalError } user, err := qtx.GetUserById(ctx, network.OwnerID) if err != nil { log.Println("database error 4:", err) - return &internalError + return &ErrInternalError } err = tx.Commit() if err != nil { log.Println("database error 5:", err) - return &internalError + return &ErrInternalError } fullNetwork := packet.FullNetwork{ @@ -174,12 +176,14 @@ func CreateNetwork(ctx context.Context, sess *session.Session, request *packet.C Position: int(*networkUser.Position), } return &packet.NetworksInfo{ - Networks: []packet.FullNetwork{fullNetwork}, + Networks: []packet.FullNetwork{fullNetwork}, + Set: false, + RemoveNetworks: nil, } } func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload, error) { - networksInfo := &packet.NetworksInfo{} + var fullNetworks []packet.FullNetwork tx, err := db.BeginTx(ctx, nil) if err != nil { @@ -208,7 +212,7 @@ func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload return nil, err } - networksInfo.Networks = append(networksInfo.Networks, packet.FullNetwork{ + fullNetworks = append(fullNetworks, packet.FullNetwork{ Network: network, Frequencies: frequencies, Members: members, @@ -221,10 +225,15 @@ func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload return nil, err } - return networksInfo, nil + return &packet.NetworksInfo{ + Networks: fullNetworks, + RemoveNetworks: nil, + Set: true, + }, nil } -// FIXME: Deletion of a network is not handled! it needs to be shifted like how it works with frequencies! +// FIXME: Deletion of a network is not handled! +// it needs to be shifted like how it works with frequencies! func SwapUserNetworks(ctx context.Context, sess *session.Session, request *packet.SwapUserNetworks) packet.Payload { queries := data.New(db) pos1, pos2 := int64(request.Pos1), int64(request.Pos2) @@ -235,8 +244,64 @@ func SwapUserNetworks(ctx context.Context, sess *session.Session, request *packe }) if err != nil { log.Println("database error:", err) - return &internalError + return &ErrInternalError } return request } + +func CreateFrequency(ctx context.Context, sess *session.Session, request *packet.CreateFrequency) packet.Payload { + queries := data.New(db) + + // Check if authorized + userNetwork, err := queries.GetUserNetwork(ctx, data.GetUserNetworkParams{ + UserID: sess.ID(), + NetworkID: request.Network, + }) + if err == sql.ErrNoRows { + return &packet.Error{Error: "user entry in network doesn't exist"} + } + if err != nil { + log.Println("database error 1:", err) + return &ErrInternalError + } + if !userNetwork.IsAdmin || !userNetwork.IsMember || userNetwork.IsBanned { + return &ErrPermissionDenied + } + + if len(request.Name) > packet.MaxFrequencyName { + return &packet.Error{Error: fmt.Sprintf( + "exceeded allowed frequency name length in bytes: %v", + packet.MaxFrequencyName, + )} + } + + if ok, err := isValidHexColor(request.HexColor); !ok { + return &packet.Error{Error: err} + } + + if request.Perms < 0 || request.Perms > packet.PermMax { + return &packet.Error{Error: fmt.Sprintf( + "exceeded allowed perms value: 0 <= perms < %v", packet.PermMax, + )} + } + + frequency, err := queries.CreateFrequency(ctx, data.CreateFrequencyParams{ + ID: sess.Manager().Node().Generate(), + NetworkID: request.Network, + Name: request.Name, + HexColor: &request.HexColor, + Perms: int64(request.Perms), + }) + if err != nil { + log.Println("database error 2:", err) + return &ErrInternalError + } + + return &packet.FrequenciesInfo{ + RemoveFrequencies: nil, + Frequencies: []data.Frequency{frequency}, + Network: request.Network, + Set: false, + } +} diff --git a/internal/server/server.go b/internal/server/server.go index 2ca0c2a..b6c4aad 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -318,6 +318,9 @@ func processRequest(ctx context.Context, sess *session.Session, request packet.P case *packet.SwapUserNetworks: response = timeout(5*time.Millisecond, api.SwapUserNetworks, ctx, sess, request) + case *packet.CreateFrequency: + response = timeout(5*time.Millisecond, api.CreateFrequency, ctx, sess, request) + case *packet.SendMessage: response = timeout(20*time.Millisecond, api.SendMessage, ctx, sess, request) case *packet.RequestMessages: |
