feat(tags): upsert note tags
This commit is contained in:
parent
f95bb61cbf
commit
187d4f4f70
1 changed files with 33 additions and 0 deletions
|
|
@ -48,3 +48,36 @@ func (r *tagRepository) Upsert(names []string) error {
|
|||
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
func (r *tagRepository) UpsertNoteTags(noteID int64, tagIDs []int64) error {
|
||||
if len(tagIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
tx, err := r.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Rollback()
|
||||
|
||||
placeholders := make([]string, 0, len(tagIDs))
|
||||
args := make([]any, 0, len(tagIDs))
|
||||
|
||||
for _, tagID := range tagIDs {
|
||||
placeholders = append(placeholders, "(?, ?)")
|
||||
args = append(args, noteID, tagID)
|
||||
}
|
||||
|
||||
query := "WITH input(note_id, tag_id) AS (VALUES " +
|
||||
strings.Join(placeholders, ",") +
|
||||
") INSERT INTO note_tags(note_id, tag_id) " +
|
||||
"SELECT note_id, tag_id FROM input " +
|
||||
"ON CONFLICT(note_id, tag_id) DO NOTHING" +
|
||||
"SELECT note_id, tag_id FROM input;"
|
||||
|
||||
if _, err := tx.Exec(query, args...); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue