summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2024-12-21 19:00:37 +0200
committerKyren223 <Kyren223@proton.me>2024-12-21 19:00:37 +0200
commite6237f5b1265f43d25963408ab09689e38050a3e (patch)
tree8b9071655d5f26cfc8170f2f1f864d6928308cae /internal
parente88c5f242dbb30f5fc7a9dfb581fa519d2e5ff11 (diff)
Prevented deletion of frequency if it's the only one in the network
Diffstat (limited to 'internal')
-rw-r--r--internal/client/ui/core/frequencylist/frequencylist.go5
-rw-r--r--internal/server/api/api.go14
2 files changed, 18 insertions, 1 deletions
diff --git a/internal/client/ui/core/frequencylist/frequencylist.go b/internal/client/ui/core/frequencylist/frequencylist.go
index bc4ef05..d2e7dc5 100644
--- a/internal/client/ui/core/frequencylist/frequencylist.go
+++ b/internal/client/ui/core/frequencylist/frequencylist.go
@@ -116,6 +116,11 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
m.index = min(m.FrequenciesLength()-1, m.index+1)
case "ctrl+d":
+ if len(m.Network().Frequencies) == 1 {
+ // Don't delete the last frequency!
+ return m, nil
+ }
+ // TODO: consider adding a confirmation popup
frequencyId := m.Network().Frequencies[m.index].ID
return m, gateway.Send(&packet.DeleteFrequency{
Frequency: frequencyId,
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index 479da95..75d7d02 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -331,6 +331,7 @@ func SwapFrequencies(ctx context.Context, sess *session.Session, request *packet
func DeleteFrequency(ctx context.Context, sess *session.Session, request *packet.DeleteFrequency) packet.Payload {
queries := data.New(db)
+ // Existence
frequency, err := queries.GetFrequencyById(ctx, request.Frequency)
if err == sql.ErrNoRows {
return &packet.Error{Error: "frequency doesn't exist"}
@@ -340,6 +341,7 @@ func DeleteFrequency(ctx context.Context, sess *session.Session, request *packet
return &ErrInternalError
}
+ // Authentication
isAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), frequency.NetworkID)
if err == sql.ErrNoRows {
return &packet.Error{Error: "either user or network don't exist"}
@@ -352,11 +354,21 @@ func DeleteFrequency(ctx context.Context, sess *session.Session, request *packet
return &ErrPermissionDenied
}
- err = queries.DeleteFrequency(ctx, frequency.ID)
+ // At least one frequency exists
+ frequencies, err := queries.GetNetworkFrequencies(frequency.NetworkID)
if err != nil {
log.Println("database error 3:", err)
return &ErrInternalError
}
+ if len(frequencies) == 1 {
+ return &packet.Error{Error: "at least 1 frequency must exist at all times"}
+ }
+
+ err = queries.DeleteFrequency(ctx, frequency.ID)
+ if err != nil {
+ log.Println("database error 4:", err)
+ return &ErrInternalError
+ }
return &packet.FrequenciesInfo{
RemoveFrequencies: []snowflake.ID{frequency.ID},