1
0
mirror of https://github.com/garraflavatra/rolens.git synced 2024-11-28 10:22:24 +01:00
rolens/internal/app/collection_indexes.go

129 lines
3.2 KiB
Go

package app
import (
"encoding/json"
"math"
"github.com/wailsapp/wails/v2/pkg/runtime"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type GetIndexesResult struct {
Indexes []bson.M `json:"indexes"`
Error string `json:"error"`
}
func (a *App) GetIndexes(hostKey, dbKey, collKey string) (result GetIndexesResult) {
client, ctx, close, err := a.connectToHost(hostKey)
if err != nil {
return
}
defer close()
cur, err := client.Database(dbKey).Collection(collKey).Indexes().List(ctx)
if err != nil {
runtime.LogWarningf(a.ctx, "Encountered an error while creating index cursor: %s", err.Error())
result.Error = err.Error()
return
}
err = cur.All(ctx, &result.Indexes)
if err != nil {
runtime.LogWarningf(a.ctx, "Encountered an error while executing index cursor: %s", err.Error())
result.Error = err.Error()
}
return
}
func (a *App) CreateIndex(hostKey, dbKey, collKey, jsonData string) string {
client, ctx, close, err := a.connectToHost(hostKey)
if err != nil {
return ""
}
defer close()
type modelItem struct {
Key string `json:"key"`
Sort interface{} `json:"sort"`
}
var form struct {
Name string `json:"name"`
Background bool `json:"background"`
Unique bool `json:"unique"`
DropDuplicates bool `json:"dropDuplicates"`
Sparse bool `json:"sparse"`
Model []modelItem `json:"model"`
}
err = json.Unmarshal([]byte(jsonData), &form)
if err != nil {
runtime.LogErrorf(a.ctx, "Could not parse index JSON: %s", err.Error())
runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
Title: "Malformed JSON",
Message: err.Error(),
Type: runtime.ErrorDialog,
})
return ""
}
if form.Model == nil {
form.Model = make([]modelItem, 0)
}
var keys bson.D
for _, v := range form.Model {
asFloat, canBeFloat := v.Sort.(float64)
if canBeFloat {
v.Sort = int8(math.Floor(asFloat))
}
keys = append(keys, bson.E{
Key: v.Key,
Value: v.Sort,
})
}
indexModel := mongo.IndexModel{
Keys: keys,
Options: options.Index().SetUnique(form.Unique).SetSparse(form.Sparse),
}
name, err := client.Database(dbKey).Collection(collKey).Indexes().CreateOne(ctx, indexModel)
if err != nil {
runtime.LogWarningf(a.ctx, "Encountered an error while creating index: %s", err.Error())
runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
Title: "Error creating index",
Message: err.Error(),
Type: runtime.ErrorDialog,
})
return ""
}
return name
}
func (a *App) DropIndex(hostKey, dbKey, collKey, indexName string) bool {
client, ctx, close, err := a.connectToHost(hostKey)
if err != nil {
return false
}
defer close()
_, err = client.Database(dbKey).Collection(collKey).Indexes().DropOne(ctx, indexName, &options.DropIndexesOptions{})
if err != nil {
runtime.LogErrorf(a.ctx, "Encountered an error while creating index drop cursor: %s", err.Error())
runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
Title: "Error creating drop cursor",
Message: err.Error(),
Type: runtime.ErrorDialog,
})
return false
}
return true
}