diff --git a/backend/handlers/handle_notes.go b/backend/handlers/handle_notes.go index b40cfd1..17cdb7e 100644 --- a/backend/handlers/handle_notes.go +++ b/backend/handlers/handle_notes.go @@ -2,18 +2,21 @@ package handlers import ( "net/http" + "path/filepath" "github.com/gin-gonic/gin" ) -func (store *Store) GetNote(ctx *gin.Context) { +func (store *Store) GetNoteFile(ctx *gin.Context) { path := ctx.Param("path") - note, err := store.Notes.GetNote(path) + path, err := store.Notes.ParsePath(path) if err != nil { ctx.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } - ctx.JSON(http.StatusOK, note) + // Get the filename from path + filename := filepath.Base(path) + ctx.FileAttachment(path, filename) } diff --git a/backend/main.go b/backend/main.go index fc0e711..16ae27a 100644 --- a/backend/main.go +++ b/backend/main.go @@ -70,7 +70,7 @@ func main() { r.GET("/spotify/recent", store.RecentlyPlayed) // r.POST("/spotify", store.SendSong) - r.GET("/notes/*path", store.GetNote) + r.GET("/notes/*path", store.GetNoteFile) r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Hello World"}) diff --git a/backend/services/notes.go b/backend/services/notes.go index 2bb6f06..c9ee34a 100644 --- a/backend/services/notes.go +++ b/backend/services/notes.go @@ -5,19 +5,12 @@ import ( "os" "path/filepath" "strings" - "time" ) type NotesConfig struct { Dir string } -type Note struct { - Filename string `json:"title"` - Contents string `json:"contents"` - LastEdited time.Time `json:"last_edited"` -} - type Notes struct { Config NotesConfig } @@ -28,39 +21,26 @@ func InitNotes(config *NotesConfig) *Notes { } } -var ErrPathTraversal = errors.New("invalid path") +func (notes *Notes) ParsePath(path string) (string, error) { + if path == "" { + path = "Index.md" + } -func (notes *Notes) GetNote(path string) (*Note, error) { baseDir, err := filepath.Abs(notes.Config.Dir) if err != nil { - return nil, err + return "", err } fullPath := filepath.Join(baseDir, path) fullPath, err = filepath.Abs(fullPath) if err != nil { - return nil, err + return "", err } // Enforce directory boundary if !strings.HasPrefix(fullPath, baseDir+string(os.PathSeparator)) { - return nil, ErrPathTraversal + return "", errors.New("Invalid path") } - fullPath += ".md" - data, err := os.ReadFile(fullPath) - if err != nil { - return nil, err - } - - info, err := os.Stat(fullPath) - if err != nil { - return nil, err - } - - return &Note{ - Filename: info.Name(), - Contents: string(data), - LastEdited: info.ModTime(), - }, nil + return fullPath, nil }