documents.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package sqlite
  2. import (
  3. "bytes"
  4. "context"
  5. "excalidraw-complete/core"
  6. "fmt"
  7. "database/sql"
  8. "log"
  9. _ "github.com/mattn/go-sqlite3"
  10. "github.com/oklog/ulid/v2"
  11. "github.com/sirupsen/logrus"
  12. )
  13. var savedDocuments = make(map[string]core.Document)
  14. type documentStore struct {
  15. db *sql.DB
  16. }
  17. func NewDocumentStore(dataSourceName string) core.DocumentStore {
  18. // db, err := sql.Open("sqlite3", ":memory:")
  19. db, err := sql.Open("sqlite3", dataSourceName)
  20. if err != nil {
  21. log.Fatal(err)
  22. }
  23. sts := `CREATE TABLE IF NOT EXISTS documents (id TEXT PRIMARY KEY, data BLOB);`
  24. _, err = db.Exec(sts)
  25. if err != nil {
  26. log.Fatal(err)
  27. }
  28. return &documentStore{db}
  29. }
  30. func (s *documentStore) FindID(ctx context.Context, id string) (*core.Document, error) {
  31. log := logrus.WithField("document_id", id)
  32. log.Debug("Retrieving document by ID")
  33. var data []byte
  34. err := s.db.QueryRowContext(ctx, "SELECT data FROM documents WHERE id = ?", id).Scan(&data)
  35. if err != nil {
  36. if err == sql.ErrNoRows {
  37. log.WithField("error", "document not found").Warn("Document with specified ID not found")
  38. return nil, fmt.Errorf("document with id %s not found", id)
  39. }
  40. log.WithField("error", err).Error("Failed to retrieve document")
  41. return nil, err
  42. }
  43. document := core.Document{
  44. Data: *bytes.NewBuffer(data),
  45. }
  46. log.Info("Document retrieved successfully")
  47. return &document, nil
  48. }
  49. func (s *documentStore) Create(ctx context.Context, document *core.Document) (string, error) {
  50. id := ulid.Make().String()
  51. data := document.Data.Bytes()
  52. log := logrus.WithFields(logrus.Fields{
  53. "document_id": id,
  54. "data_length": len(data),
  55. })
  56. _, err := s.db.ExecContext(ctx, "INSERT INTO documents (id, data) VALUES (?, ?)", id, data)
  57. if err != nil {
  58. log.WithField("error", err).Error("Failed to create document")
  59. return "", err
  60. }
  61. log.Info("Document created successfully")
  62. return id, nil
  63. }