feat: add get_all_tags_for_entry method

This commit is contained in:
Thomas Bishop 2025-07-17 16:53:56 +01:00
parent 13f6bbc748
commit 7e997bacaa
4 changed files with 43 additions and 19 deletions

View file

@ -1,18 +1,30 @@
export default class TagsController {
tagsService
tagsService
constructor(tagsService) {
this.tagsService = tagsService
}
constructor(tagsService) {
this.tagsService = tagsService
}
getAllTags = (req, res) => {
const tags = this.tagsService.getAllTags()
if (!tags) {
return res.status(404).json({
message: `Tags list could not be retrieved`,
})
}
getAllTags = (req, res) => {
const tags = this.tagsService.getAllTags()
if (!tags) {
return res.status(404).json({
message: `Tags list could not be retrieved`,
})
}
return res.json(tags)
}
return res.json(tags)
}
getTagsForEntry = (req, res) => {
const entryTitle = req.params.entryTitle
const entries = this.tagsService.getTagsForEntry(entryTitle)
if (!entries) {
return res.status(404).json({
message: `Tag list could not be retrieved for entry ${entryTitle}`,
})
}
return res.json(entries)
}
}

View file

@ -8,5 +8,6 @@ const tagsService = new TagsService(database)
const tagsController = new TagsController(tagsService)
router.get("/", tagsController.getAllTags)
router.get("/:entryTitle", tagsController.getTagsForEntry)
export default router

View file

@ -1,4 +1,4 @@
import { GET_ALL_TAGS } from "../sql/tags.js"
import { GET_ALL_TAGS, GET_TAGS_FOR_ENTRY } from "../sql/tags.js"
export default class TagsService {
database
@ -8,11 +8,20 @@ export default class TagsService {
}
getAllTags = () => {
const tags = this._sortTags(this.database.prepare(GET_ALL_TAGS).all()).flatMap((tag) => tag.name)
return { count: tags.length, tags: tags }
const tags = this.database.prepare(GET_ALL_TAGS).all()
const sorted = this._sortTags(tags, "name")
const list = sorted.flatMap((tag) => tag.name)
return { count: tags.length, tags: list }
}
_sortTags = (tags) => {
return tags.sort((a, b) => a.name.localeCompare(b.name))
getTagsForEntry = (entryTitle) => {
const tags = this.database.prepare(GET_TAGS_FOR_ENTRY).all(entryTitle)
const sorted = this._sortTags(tags, "tag_name")
const list = sorted.flatMap((tag) => tag.tag_name)
return { count: tags.length, tags: list }
}
_sortTags = (tags, fieldName) => {
return tags.sort((a, b) => a[fieldName].localeCompare(b[fieldName]))
}
}

View file

@ -1,3 +1,5 @@
const GET_ALL_TAGS = `SELECT name FROM tags`
export { GET_ALL_TAGS }
const GET_TAGS_FOR_ENTRY = `SELECT tag_name FROM entries_tags WHERE entry_title = ?`
export { GET_ALL_TAGS, GET_TAGS_FOR_ENTRY }