added obsidian note api

This commit is contained in:
2026-01-12 15:46:01 +00:00
parent 77a7c3250e
commit 99ace613ce
4 changed files with 92 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func (store *Store) GetNote(ctx *gin.Context) {
path := ctx.Param("path")
note, err := store.Notes.GetNote(path)
if err != nil {
ctx.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
return
}
ctx.JSON(http.StatusOK, note)
}

View File

@@ -12,4 +12,5 @@ type Store struct {
SpotifyAuth *spotifyauth.Authenticator
SpotifyClient *spotify.Client
Auth *services.Auth
Notes *services.Notes
}

View File

@@ -39,7 +39,11 @@ func main() {
authConfig := services.AuthConfig{Secret: []byte(authSecret), Domain: domainName, RefreshTokenLifetime: refreshTokenLifetime, AccessTokenLifetime: accessTokenLifetime, Endpoint: backendEndpoint}
auth := services.InitAuth(&authConfig)
store := handlers.Store{DB: db, SpotifyAuth: spotifyAuth, SpotifyClient: client, Auth: auth}
notesDir := os.Getenv("OBSIDIAN_DIR")
notesConfig := services.NotesConfig{Dir: notesDir}
notes := services.InitNotes(&notesConfig)
store := handlers.Store{DB: db, SpotifyAuth: spotifyAuth, SpotifyClient: client, Auth: auth, Notes: notes}
r := gin.Default()
protected := r.Group("/", store.AuthMiddlewear)
@@ -66,6 +70,8 @@ func main() {
r.GET("/spotify/recent", store.RecentlyPlayed)
// r.POST("/spotify", store.SendSong)
r.GET("/notes/*path", store.GetNote)
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Hello World"})
})

65
backend/services/notes.go Normal file
View File

@@ -0,0 +1,65 @@
package services
import (
"errors"
"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
}
func InitNotes(config *NotesConfig) *Notes {
return &Notes{
Config: *config,
}
}
var ErrPathTraversal = errors.New("invalid path")
func (notes *Notes) GetNote(path string) (*Note, error) {
baseDir, err := filepath.Abs(notes.Config.Dir)
if err != nil {
return nil, err
}
fullPath := filepath.Join(baseDir, path)
fullPath, err = filepath.Abs(fullPath)
if err != nil {
return nil, err
}
// Enforce directory boundary
if !strings.HasPrefix(fullPath, baseDir+string(os.PathSeparator)) {
return nil, ErrPathTraversal
}
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
}