const { BaseCommand } = require('./base-command.js'); const { app } = require('./app.js'); const { _ } = require('lib/locale.js'); const Tag = require('lib/models/Tag.js'); const BaseModel = require('lib/BaseModel.js'); class Command extends BaseCommand { usage() { return 'tag [tag] [note]'; } description() { return _(' can be "add", "remove" or "list" to assign or remove [tag] from [note], or to list the notes associated with [tag]. The command `tag list` can be used to list all the tags.'); } async action(args) { let tag = null; if (args.tag) tag = await app().loadItem(BaseModel.TYPE_TAG, args.tag); let notes = []; if (args.note) { notes = await app().loadItems(BaseModel.TYPE_NOTE, args.note); } const command = args['tag-command']; if (command == 'remove' && !tag) throw new Error(_('Cannot find "%s".', args.tag)); if (command == 'add') { if (!notes.length) throw new Error(_('Cannot find "%s".', args.note)); if (!tag) tag = await Tag.save({ title: args.tag }, { userSideValidation: true }); for (let i = 0; i < notes.length; i++) { await Tag.addNote(tag.id, notes[i].id); } } else if (command == 'remove') { if (!tag) throw new Error(_('Cannot find "%s".', args.tag)); if (!notes.length) throw new Error(_('Cannot find "%s".', args.note)); for (let i = 0; i < notes.length; i++) { await Tag.removeNote(tag.id, notes[i].id); } } else if (command == 'list') { if (tag) { let notes = await Tag.notes(tag.id); notes.map((note) => { this.stdout(note.title); }); } else { let tags = await Tag.all(); tags.map((tag) => { this.stdout(tag.title); }); } } else { throw new Error(_('Invalid command: "%s"', command)); } } } module.exports = Command;