controller.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import Database from 'better-sqlite3'
  2. import { v4 } from 'uuid'
  3. const db = new Database('./cosette.db')
  4. function load() {
  5. db.pragma('journal_mode = WAL')
  6. db.exec('CREATE TABLE IF NOT EXISTS cosette (uuid TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, tags TEXT, images TEXT, updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP)')
  7. db.exec('CREATE INDEX cosette_updated_at_index ON cosette (updatedAt)')
  8. db.exec('CREATE TABLE IF NOT EXISTS chan (uuid TEXT PRIMARY KEY, cosetta_uuid REFERENCES cosette(uuid), message TEXT, updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP)')
  9. }
  10. // TODO: da gestire in qualche modo all'avvio
  11. // load()
  12. export function add(cosetta) {
  13. const q = db.prepare('INSERT INTO cosette (uuid, name, description, tags, images) VALUES(:uuid, :name, :description, :tags, :imgs)')
  14. cosetta.uuid = v4()
  15. cosetta.tags = JSON.stringify(cosetta.tags.split(',').map(t => t.toLowerCase().trim()))
  16. cosetta.imgs = JSON.stringify(cosetta.imgs)
  17. q.run(cosetta)
  18. return cosetta
  19. }
  20. export function get(uuid) {
  21. let q = db.prepare('SELECT * from cosette WHERE uuid = ?')
  22. const cosetta = q.get(uuid)
  23. cosetta.tags = cosetta.tags ? JSON.parse(cosetta.tags) : []
  24. cosetta.images = cosetta.images ? JSON.parse(cosetta.images) : []
  25. q = db.prepare('SELECT message, updatedAt FROM chan WHERE cosetta_uuid = ? ORDER BY updatedAt desc')
  26. const comments = q.all(uuid)
  27. return { cosetta, comments }
  28. }
  29. export function getAll({ page }) {
  30. page = Number(page || 0)
  31. const perPage = 3
  32. let query = 'SELECT * FROM cosette ORDER BY updatedAt DESC LIMIT ? OFFSET ?'
  33. const q = db.prepare(query)
  34. const ret = q.all(perPage, perPage * page)
  35. const cosette = ret.map(r => {
  36. r.tags = r.tags ? JSON.parse(r.tags) : []
  37. r.images = r.images ? JSON.parse(r.images) : []
  38. return r
  39. })
  40. const count = db.prepare('SELECT COUNT(*) count from cosette').get().count
  41. return { cosette, details: { page, count, prev: page !== 0, next: count > perPage * (page + 1), n_page: Math.ceil(count / perPage) } }
  42. }
  43. export function addComment(comment) {
  44. const q = db.prepare('INSERT INTO chan (uuid, cosetta_uuid, message) VALUES(:uuid, :cosetta_uuid, :message)')
  45. comment.uuid = v4()
  46. q.run(comment)
  47. return comment
  48. }
  49. export function getComments(cosetta_uuid) {
  50. const q = db.prepare('SELECT * from chan WHERE cosetta_uuid = ?')
  51. return q.all(cosetta_uuid)
  52. }