first commit

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
HouYunFei
2026-05-19 07:53:53 +08:00
commit 472bf8b732
133 changed files with 16869 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
package handler
import (
"encoding/json"
"log"
"net/http"
"github.com/basketikun/infinite-canvas/model"
"github.com/basketikun/infinite-canvas/service"
)
type adminSyncRequest struct {
Category string `json:"category"`
}
func AdminPromptCategories(w http.ResponseWriter, r *http.Request) {
OK(w, service.ListPromptCategories())
}
func AdminPrompts(w http.ResponseWriter, r *http.Request) {
result, err := service.ListPrompts(parseQuery(r))
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
func AdminSavePrompt(w http.ResponseWriter, r *http.Request) {
var item model.Prompt
_ = json.NewDecoder(r.Body).Decode(&item)
result, err := service.SavePrompt(item)
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
func AdminDeletePrompt(w http.ResponseWriter, r *http.Request, id string) {
if err := service.DeletePrompt(id); err != nil {
Fail(w, err.Error())
return
}
OK(w, true)
}
func AdminSyncPromptCategories(w http.ResponseWriter, r *http.Request) {
var request adminSyncRequest
_ = json.NewDecoder(r.Body).Decode(&request)
log.Printf("sync prompt category start category=%s", request.Category)
categories, err := service.SyncPromptCategory(request.Category)
if err != nil {
log.Printf("sync prompt category failed category=%s err=%v", request.Category, err)
Fail(w, err.Error())
return
}
log.Printf("sync prompt category done category=%s", request.Category)
OK(w, categories)
}
+46
View File
@@ -0,0 +1,46 @@
package handler
import (
"encoding/json"
"net/http"
"github.com/basketikun/infinite-canvas/model"
"github.com/basketikun/infinite-canvas/service"
)
func Assets(w http.ResponseWriter, r *http.Request) {
result, err := service.ListAssets(parseQuery(r))
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
func AdminAssets(w http.ResponseWriter, r *http.Request) {
result, err := service.ListAssets(parseQuery(r))
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
func AdminSaveAsset(w http.ResponseWriter, r *http.Request) {
var item model.Asset
_ = json.NewDecoder(r.Body).Decode(&item)
result, err := service.SaveAsset(item)
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
func AdminDeleteAsset(w http.ResponseWriter, r *http.Request, id string) {
if err := service.DeleteAsset(id); err != nil {
Fail(w, err.Error())
return
}
OK(w, true)
}
+107
View File
@@ -0,0 +1,107 @@
package handler
import (
"encoding/json"
"net/http"
"github.com/basketikun/infinite-canvas/model"
"github.com/basketikun/infinite-canvas/service"
)
type loginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
type registerRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
type saveUserRequest struct {
ID string `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
Role model.UserRole `json:"role"`
}
func Register(w http.ResponseWriter, r *http.Request) {
var request registerRequest
_ = json.NewDecoder(r.Body).Decode(&request)
session, err := service.Register(request.Username, request.Password)
if err != nil {
Fail(w, err.Error())
return
}
OK(w, session)
}
func Login(w http.ResponseWriter, r *http.Request) {
var request loginRequest
_ = json.NewDecoder(r.Body).Decode(&request)
session, err := service.Login(request.Username, request.Password)
if err != nil {
Fail(w, err.Error())
return
}
if session.User.Role != model.UserRoleAdmin {
Fail(w, "需要管理员权限")
return
}
OK(w, session)
}
func AdminLogin(w http.ResponseWriter, r *http.Request) {
var request loginRequest
_ = json.NewDecoder(r.Body).Decode(&request)
session, err := service.Login(request.Username, request.Password)
if err != nil {
Fail(w, err.Error())
return
}
if session.User.Role != model.UserRoleAdmin {
Fail(w, "需要管理员权限")
return
}
OK(w, session)
}
func CurrentUser(w http.ResponseWriter, r *http.Request) {
if user, ok := service.UserFromContext(r.Context()); ok {
OK(w, user)
return
}
OK(w, service.GuestUser())
}
func AdminUsers(w http.ResponseWriter, r *http.Request) {
users, err := service.ListUsers(parseQuery(r))
if err != nil {
Fail(w, err.Error())
return
}
OK(w, users)
}
func AdminSaveUser(w http.ResponseWriter, r *http.Request) {
var request saveUserRequest
_ = json.NewDecoder(r.Body).Decode(&request)
user, err := service.SaveUser(model.User{
ID: request.ID,
Username: request.Username,
Role: request.Role,
}, request.Password)
if err != nil {
Fail(w, err.Error())
return
}
OK(w, user)
}
func AdminDeleteUser(w http.ResponseWriter, r *http.Request, id string) {
if err := service.DeleteUser(id); err != nil {
Fail(w, err.Error())
return
}
OK(w, true)
}
+16
View File
@@ -0,0 +1,16 @@
package handler
import (
"net/http"
"github.com/basketikun/infinite-canvas/service"
)
func Prompts(w http.ResponseWriter, r *http.Request) {
result, err := service.ListPrompts(parseQuery(r))
if err != nil {
Fail(w, err.Error())
return
}
OK(w, result)
}
+42
View File
@@ -0,0 +1,42 @@
package handler
import (
"encoding/json"
"net/http"
"strconv"
"github.com/basketikun/infinite-canvas/model"
)
type response struct {
Code int `json:"code"`
Data any `json:"data"`
Msg string `json:"msg"`
}
func OK(w http.ResponseWriter, data any) {
writeJSON(w, response{Code: 0, Data: data, Msg: "ok"})
}
func Fail(w http.ResponseWriter, msg string) {
writeJSON(w, response{Code: 1, Data: nil, Msg: msg})
}
func writeJSON(w http.ResponseWriter, value any) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(value)
}
func parseQuery(r *http.Request) model.Query {
q := r.URL.Query()
page, _ := strconv.Atoi(q.Get("page"))
pageSize, _ := strconv.Atoi(q.Get("pageSize"))
return model.Query{
Keyword: q.Get("keyword"),
Tags: q["tag"],
Category: q.Get("category"),
Type: q.Get("type"),
Page: page,
PageSize: pageSize,
}
}