剪切板也是1个用的比较少的功能,移除了喵

This commit is contained in:
Akizon committed 2026-09-22 15:15:37 +08:00
1 parent 68c284d043
commit 7d692d2faf
7 files changed
+1 -205

No files matched your search

-64
View File
@@ -1,64 +0,0 @@
package clipboard
import (
"time"
"github.com/komari-monitor/komari/database/dbcore"
"github.com/komari-monitor/komari/database/models"
)
// CreateClipboard 创建剪贴板记录
func CreateClipboard(cb *models.Clipboard) error {
db := dbcore.GetDBInstance()
cb.CreatedAt = time.Now().UTC()
cb.UpdatedAt = cb.CreatedAt
return db.Create(cb).Error
}
// GetClipboardByID 根据ID获取剪贴板记录
func GetClipboardByID(id int) (*models.Clipboard, error) {
var cb models.Clipboard
db := dbcore.GetDBInstance()
if err := db.First(&cb, id).Error; err != nil {
return nil, err
}
return &cb, nil
}
// UpdateClipboardFields 更新剪贴板记录
func UpdateClipboardFields(id int, fields map[string]interface{}) error {
db := dbcore.GetDBInstance()
delete(fields, "created_at")
fields["updated_at"] = time.Now().UTC()
return db.Model(&models.Clipboard{}).Where("id = ?", id).Updates(fields).Error
}
// DeleteClipboard 删除剪贴板记录
func DeleteClipboard(id int) error {
db := dbcore.GetDBInstance()
// Check if record exists first
var cb models.Clipboard
if err := db.First(&cb, id).Error; err != nil {
return err // Record not found or other error
}
return db.Delete(&cb).Error
}
// DeleteClipboardBatch 批量删除剪贴板记录
func DeleteClipboardBatch(ids []int) error {
if len(ids) == 0 {
return nil
}
db := dbcore.GetDBInstance()
return db.Where("id IN ?", ids).Delete(&models.Clipboard{}).Error
}
// ListClipboard 列出所有剪贴板记录
func ListClipboard() ([]models.Clipboard, error) {
var list []models.Clipboard
db := dbcore.GetDBInstance()
if err := db.Find(&list).Error; err != nil {
return nil, err
}
return list, nil
}
-1
View File
@@ -450,7 +450,6 @@ func doInitialize() error {
&models.User{},
&models.Client{},
&models.Log{},
&models.Clipboard{},
&models.OfflineNotification{},
&models.PingTask{},
&models.OidcProvider{},
-13
View File
@@ -1,13 +0,0 @@
package models
import "time"
type Clipboard struct {
Id int `json:"id" gorm:"primaryKey;autoIncrement;unique"`
Text string `json:"text" gorm:"type:longtext"`
Name string `json:"name" gorm:"type:varchar(255)"`
Weight int `json:"weight" gorm:"type:int"`
Remark string `json:"remark" gorm:"type:text"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
-2
View File
@@ -35,8 +35,6 @@ var legacyTimestampColumns = [...]timestampColumn{
{table: "sessions", column: "expires"},
{table: "sessions", column: "created_at"},
{table: "logs", column: "time"},
{table: "clipboards", column: "created_at"},
{table: "clipboards", column: "updated_at"},
{table: "offline_notifications", column: "last_notified"},
{table: "task_results", column: "finished_at"},
{table: "task_results", column: "created_at"},
-11
View File
@@ -203,17 +203,6 @@ func registerAdminRoutes(r *gin.Engine) {
g.GET("/logs", jsonRpc.Bind("admin:getLogs", jsonRpc.WithQuery("limit", "page")))
// clipboard
clipboardGroup := g.Group("/clipboard")
{
clipboardGroup.GET("/:id", jsonRpc.Bind("admin:getClipboard", jsonRpc.WithPath("id")))
clipboardGroup.GET("", jsonRpc.Bind("admin:listClipboard"))
clipboardGroup.POST("", jsonRpc.Bind("admin:createClipboard"))
clipboardGroup.POST("/:id", jsonRpc.Bind("admin:updateClipboard", jsonRpc.WithPath("id")))
clipboardGroup.POST("/remove", jsonRpc.Bind("admin:batchDeleteClipboard"))
clipboardGroup.POST("/:id/remove", jsonRpc.Bind("admin:deleteClipboard", jsonRpc.WithPath("id")))
}
// plugins: 安装流程通过统一的分片上传接口,启停/列表/日志走 RPC2,市场对齐主题市场。
pluginGroup := g.Group("/plugin")
{
+1 -1
View File
@@ -113,7 +113,7 @@ handler 退化为薄适配层:解析 gin 参数 → 调 RPC → 把响应映
| 命名空间 | 方法(文件) |
| --- | --- |
| `admin` | client CRUD、ping task、session/settings/weight、notification(load/offline/traffic)、clipboard、provider(messageSender/oidc)、task 查询、system(logs/cloudflared/exec/test) |
| `admin` | client CRUD、ping task、session/settings/weight、notification(load/offline/traffic)、provider(messageSender/oidc)、task 查询、system(logs/cloudflared/exec/test) |
| `public` | getMe、getNodesInformation、getPublicSettings、getVersion、getClientRecentRecords、getRecordsByUUID、getPingRecords、getPublicPingTasks |
| Agent v2 | `agent.report`、`agent.basicInfo`、`agent.pingResult`、`agent.taskResult`、`agent.pull`(`/api/clients/v2/rpc`) |
-113
View File
@@ -1,113 +0,0 @@
package jsonrpc
import (
"context"
"strconv"
"github.com/komari-monitor/komari/database/auditlog"
clipboardDB "github.com/komari-monitor/komari/database/clipboard"
"github.com/komari-monitor/komari/database/models"
"github.com/komari-monitor/komari/pkg/rpc"
)
// admin.clipboard.go
// 剪贴板 RPC2 方法(admin 命名空间)。
func init() {
reg("getClipboard", adminGetClipboard, "Get a clipboard entry by id")
reg("listClipboard", adminListClipboard, "List clipboard entries")
reg("createClipboard", adminCreateClipboard, "Create a clipboard entry")
reg("updateClipboard", adminUpdateClipboard, "Update a clipboard entry")
reg("deleteClipboard", adminDeleteClipboard, "Delete a clipboard entry")
reg("batchDeleteClipboard", adminBatchDeleteClipboard, "Batch delete clipboard entries")
}
func adminGetClipboard(_ context.Context, req *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
var params struct {
ID string `json:"id"`
}
req.BindParams(&params)
id, err := strconv.Atoi(params.ID)
if err != nil {
return nil, rpc.MakeError(rpc.InvalidParams, "Invalid ID", nil)
}
cb, err := clipboardDB.GetClipboardByID(id)
if err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to get clipboard: "+err.Error(), nil)
}
return cb, nil
}
func adminListClipboard(_ context.Context, _ *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
list, err := clipboardDB.ListClipboard()
if err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to list clipboard: "+err.Error(), nil)
}
return list, nil
}
func adminCreateClipboard(ctx context.Context, req *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
var cb models.Clipboard
if err := req.BindParams(&cb); err != nil {
return nil, rpc.MakeError(rpc.InvalidParams, "Invalid request: "+err.Error(), nil)
}
if err := clipboardDB.CreateClipboard(&cb); err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to create clipboard: "+err.Error(), nil)
}
actor, ip := auditActor(ctx)
auditlog.Log(ip, actor, "create clipboard:"+strconv.Itoa(cb.Id), "info")
return cb, nil
}
func adminUpdateClipboard(ctx context.Context, req *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
// id 来自路径参数(bridge 注入),其余字段为更新内容。
fields := map[string]interface{}{}
if err := req.BindParams(&fields); err != nil {
return nil, rpc.MakeError(rpc.InvalidParams, "Invalid request: "+err.Error(), nil)
}
idStr, _ := fields["id"].(string)
id, err := strconv.Atoi(idStr)
if err != nil {
return nil, rpc.MakeError(rpc.InvalidParams, "Invalid ID", nil)
}
delete(fields, "id") // 路径注入的 id 不作为更新字段
if err := clipboardDB.UpdateClipboardFields(id, fields); err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to update clipboard: "+err.Error(), nil)
}
actor, ip := auditActor(ctx)
auditlog.Log(ip, actor, "update clipboard:"+strconv.Itoa(id), "info")
return nil, nil
}
func adminDeleteClipboard(ctx context.Context, req *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
var params struct {
ID string `json:"id"`
}
req.BindParams(&params)
id, err := strconv.Atoi(params.ID)
if err != nil {
return nil, rpc.MakeError(rpc.InvalidParams, "Invalid ID", nil)
}
if err := clipboardDB.DeleteClipboard(id); err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to delete clipboard: "+err.Error(), nil)
}
actor, ip := auditActor(ctx)
auditlog.Log(ip, actor, "delete clipboard:"+strconv.Itoa(id), "warn")
return nil, nil
}
func adminBatchDeleteClipboard(ctx context.Context, req *rpc.JsonRpcRequest) (any, *rpc.JsonRpcError) {
var params struct {
IDs []int `json:"ids"`
}
req.BindParams(&params)
if len(params.IDs) == 0 {
return nil, rpc.MakeError(rpc.InvalidParams, "IDs cannot be empty", nil)
}
if err := clipboardDB.DeleteClipboardBatch(params.IDs); err != nil {
return nil, rpc.MakeError(rpc.InternalError, "Failed to batch delete clipboard: "+err.Error(), nil)
}
actor, ip := auditActor(ctx)
auditlog.Log(ip, actor, "batch delete clipboard: "+strconv.Itoa(len(params.IDs))+" items", "warn")
return nil, nil
}