Update handlers for workspaces

This commit is contained in:
2024-10-14 22:01:17 +02:00
parent 97ebf1c08e
commit 18bc50f5b4

View File

@@ -4,7 +4,6 @@ import (
"encoding/json" "encoding/json"
"io" "io"
"net/http" "net/http"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
@@ -14,8 +13,14 @@ import (
) )
func ListFiles(fs *filesystem.FileSystem) http.HandlerFunc { func ListFiles(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, _ *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
files, err := fs.ListFilesRecursively() workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
files, err := fs.ListFilesRecursively(workspaceID)
if err != nil { if err != nil {
http.Error(w, "Failed to list files", http.StatusInternalServerError) http.Error(w, "Failed to list files", http.StatusInternalServerError)
return return
@@ -30,13 +35,19 @@ func ListFiles(fs *filesystem.FileSystem) http.HandlerFunc {
func LookupFileByName(fs *filesystem.FileSystem) http.HandlerFunc { func LookupFileByName(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
filenameOrPath := r.URL.Query().Get("filename") filenameOrPath := r.URL.Query().Get("filename")
if filenameOrPath == "" { if filenameOrPath == "" {
http.Error(w, "Filename or path is required", http.StatusBadRequest) http.Error(w, "Filename or path is required", http.StatusBadRequest)
return return
} }
filePaths, err := fs.FindFileByName(filenameOrPath) filePaths, err := fs.FindFileByName(workspaceID, filenameOrPath)
if err != nil { if err != nil {
http.Error(w, "File not found", http.StatusNotFound) http.Error(w, "File not found", http.StatusNotFound)
return return
@@ -51,39 +62,32 @@ func LookupFileByName(fs *filesystem.FileSystem) http.HandlerFunc {
func GetFileContent(fs *filesystem.FileSystem) http.HandlerFunc { func GetFileContent(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/") filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/")
content, err := fs.GetFileContent(filePath) content, err := fs.GetFileContent(workspaceID, filePath)
if err != nil { if err != nil {
http.Error(w, "Failed to read file", http.StatusNotFound) http.Error(w, "Failed to read file", http.StatusNotFound)
return return
} }
// Determine content type based on file extension w.Header().Set("Content-Type", "text/plain")
contentType := "text/plain" w.Write(content)
switch filepath.Ext(filePath) {
case ".png":
contentType = "image/png"
case ".jpg", ".jpeg":
contentType = "image/jpeg"
case ".webp":
contentType = "image/webp"
case ".gif":
contentType = "image/gif"
case ".svg":
contentType = "image/svg+xml"
case ".md":
contentType = "text/markdown"
}
w.Header().Set("Content-Type", contentType)
if _, err := w.Write(content); err != nil {
http.Error(w, "Failed to write response", http.StatusInternalServerError)
}
} }
} }
func SaveFile(fs *filesystem.FileSystem) http.HandlerFunc { func SaveFile(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/") filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/")
content, err := io.ReadAll(r.Body) content, err := io.ReadAll(r.Body)
if err != nil { if err != nil {
@@ -91,7 +95,7 @@ func SaveFile(fs *filesystem.FileSystem) http.HandlerFunc {
return return
} }
err = fs.SaveFile(filePath, content) err = fs.SaveFile(workspaceID, filePath, content)
if err != nil { if err != nil {
http.Error(w, "Failed to save file", http.StatusInternalServerError) http.Error(w, "Failed to save file", http.StatusInternalServerError)
return return
@@ -106,37 +110,38 @@ func SaveFile(fs *filesystem.FileSystem) http.HandlerFunc {
func DeleteFile(fs *filesystem.FileSystem) http.HandlerFunc { func DeleteFile(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/") filePath := strings.TrimPrefix(r.URL.Path, "/api/v1/files/")
err := fs.DeleteFile(filePath) err = fs.DeleteFile(workspaceID, filePath)
if err != nil { if err != nil {
http.Error(w, "Failed to delete file", http.StatusInternalServerError) http.Error(w, "Failed to delete file", http.StatusInternalServerError)
return return
} }
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
if _, err := w.Write([]byte("File deleted successfully")); err != nil { w.Write([]byte("File deleted successfully"))
http.Error(w, "Failed to write response", http.StatusInternalServerError)
}
} }
} }
func GetSettings(db *db.DB) http.HandlerFunc { func GetSettings(db *db.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
userIDStr := r.URL.Query().Get("userId") workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
userID, err := strconv.Atoi(userIDStr)
if err != nil { if err != nil {
http.Error(w, "Invalid userId", http.StatusBadRequest) http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return return
} }
settings, err := db.GetSettings(userID) settings, err := db.GetWorkspaceSettings(workspaceID)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
settings.SetDefaults()
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(settings); err != nil { if err := json.NewEncoder(w).Encode(settings); err != nil {
http.Error(w, "Failed to encode response", http.StatusInternalServerError) http.Error(w, "Failed to encode response", http.StatusInternalServerError)
@@ -146,44 +151,36 @@ func GetSettings(db *db.DB) http.HandlerFunc {
func UpdateSettings(db *db.DB, fs *filesystem.FileSystem) http.HandlerFunc { func UpdateSettings(db *db.DB, fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
var settings models.Settings var settings models.WorkspaceSettings
if err := json.NewDecoder(r.Body).Decode(&settings); err != nil { if err := json.NewDecoder(r.Body).Decode(&settings); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadRequest)
return return
} }
settings.SetDefaults()
if err := settings.Validate(); err != nil { if err := settings.Validate(); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadRequest)
return return
} }
err := db.SaveSettings(settings) err := db.SaveWorkspaceSettings(settings)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
if settings.Settings.GitEnabled { if settings.Settings.GitEnabled {
err := fs.SetupGitRepo(settings.Settings.GitURL, settings.Settings.GitUser, settings.Settings.GitToken) err := fs.SetupGitRepo(settings.WorkspaceID, settings.Settings.GitURL, settings.Settings.GitUser, settings.Settings.GitToken)
if err != nil { if err != nil {
http.Error(w, "Failed to setup git repo", http.StatusInternalServerError) http.Error(w, "Failed to setup git repo", http.StatusInternalServerError)
return
} }
} else { } else {
fs.DisableGitRepo() fs.DisableGitRepo(settings.WorkspaceID)
}
// Fetch the saved settings to return
savedSettings, err := db.GetSettings(settings.UserID)
if err != nil {
http.Error(w, "Settings saved but could not be retrieved", http.StatusInternalServerError)
return
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(savedSettings); err != nil { if err := json.NewEncoder(w).Encode(settings); err != nil {
http.Error(w, "Failed to encode response", http.StatusInternalServerError) http.Error(w, "Failed to encode response", http.StatusInternalServerError)
} }
} }
@@ -191,11 +188,17 @@ func UpdateSettings(db *db.DB, fs *filesystem.FileSystem) http.HandlerFunc {
func StageCommitAndPush(fs *filesystem.FileSystem) http.HandlerFunc { func StageCommitAndPush(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
var requestBody struct { var requestBody struct {
Message string `json:"message"` Message string `json:"message"`
} }
err := json.NewDecoder(r.Body).Decode(&requestBody) err = json.NewDecoder(r.Body).Decode(&requestBody)
if err != nil { if err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest) http.Error(w, "Invalid request body", http.StatusBadRequest)
return return
@@ -206,7 +209,7 @@ func StageCommitAndPush(fs *filesystem.FileSystem) http.HandlerFunc {
return return
} }
err = fs.StageCommitAndPush(requestBody.Message) err = fs.StageCommitAndPush(workspaceID, requestBody.Message)
if err != nil { if err != nil {
http.Error(w, "Failed to stage, commit, and push changes: "+err.Error(), http.StatusInternalServerError) http.Error(w, "Failed to stage, commit, and push changes: "+err.Error(), http.StatusInternalServerError)
return return
@@ -220,8 +223,14 @@ func StageCommitAndPush(fs *filesystem.FileSystem) http.HandlerFunc {
} }
func PullChanges(fs *filesystem.FileSystem) http.HandlerFunc { func PullChanges(fs *filesystem.FileSystem) http.HandlerFunc {
return func(w http.ResponseWriter, _ *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
err := fs.Pull() workspaceID, err := strconv.Atoi(r.URL.Query().Get("workspaceId"))
if err != nil {
http.Error(w, "Invalid workspaceId", http.StatusBadRequest)
return
}
err = fs.Pull(workspaceID)
if err != nil { if err != nil {
http.Error(w, "Failed to pull changes: "+err.Error(), http.StatusInternalServerError) http.Error(w, "Failed to pull changes: "+err.Error(), http.StatusInternalServerError)
return return