diff --git a/app/controllers/admin/keys/key/delete.js b/app/controllers/admin/keys/key/delete.js new file mode 100644 index 0000000..8482719 --- /dev/null +++ b/app/controllers/admin/keys/key/delete.js @@ -0,0 +1,26 @@ +import Controller from '@ember/controller'; +import { action } from '@ember/object'; +import { inject as service } from '@ember/service'; + +export default class AdminKeysKeyDeleteController extends Controller { + @service router; + @service meilisearch; + @service toasts; + + @action + delete() { + return this.meilisearch.deleteKey(this.model.uid).then(() => { + // TODO: add toast + return this.router.transitionTo('admin.keys'); + }); + } + + @action + cancel() { + const newRouteName = this.router.currentRouteName.replace( + /\.(new|edit|delete)$/, + '' + ); + this.router.transitionTo(newRouteName); + } +} diff --git a/app/controllers/admin/keys/key/edit.js b/app/controllers/admin/keys/key/edit.js new file mode 100644 index 0000000..5345537 --- /dev/null +++ b/app/controllers/admin/keys/key/edit.js @@ -0,0 +1,49 @@ +import Controller from '@ember/controller'; +import { action } from '@ember/object'; +import { inject as service } from '@ember/service'; +import { tracked } from '@glimmer/tracking'; +import ActionInvoker from 'meiliadmin/lib/action-invoker'; + +export default class AdminKeysKeyEditController extends Controller { + @service router; + @service toasts; + + @tracked error; + @tracked isSaving; + + constructor() { + super(...arguments); + + this.invoker = new ActionInvoker(); + } + + @action + async save(value) { + this.error = null; + + this.isSaving = true; + + try { + const key = await this.model.save(value); + + if (this.router.isActive('admin.keys.key')) { + await this.router.refresh('admin.keys.key', key.uid); + } + + await this.router.transitionTo('admin.keys.key.index', key.uid); + } catch (error) { + this.error = error.error || error; + } finally { + this.isSaving = false; + } + } + + @action + cancel() { + const newRouteName = this.router.currentRouteName.replace( + /\.(new|edit|delete)$/, + '' + ); + this.router.transitionTo(newRouteName); + } +} diff --git a/app/models/key.js b/app/models/key.js new file mode 100644 index 0000000..ee4e273 --- /dev/null +++ b/app/models/key.js @@ -0,0 +1,49 @@ +import query from '../utils/query'; + +export default class Key { + actions = ['*']; + indexes = ['*']; + expiresAt = null; + name = ''; + description = ''; + + constructor(data = {}) { + for (const key in data) { + this[key] = data[key]; + } + } + + get path() { + return `keys/${this.uid}`; + } + + get isNew() { + return Boolean(!this.uid); + } + + get editablePayload() { + let keys = ['name', 'description']; + + if (this.isNew) { + keys = keys.concat(['actions', 'indexes', 'expiresAt', 'uid']); + } + + return Object.fromEntries( + Object.entries(this).filter(([key]) => keys.includes(key)) + ); + } + + save(data) { + const path = this.isNew ? 'keys' : this.path; + const method = this.isNew ? 'POST' : 'PATCH'; + + if (typeof data === 'object') { + data = JSON.stringify(data); + } + + return query(path, { + method: method, + body: data, + }); + } +} diff --git a/app/router.js b/app/router.js index f86e26e..7e1fbc3 100644 --- a/app/router.js +++ b/app/router.js @@ -25,7 +25,11 @@ Router.map(function () { this.route('new'); }); this.route('keys', function () { - this.route('key', { path: '/:uid' }); + this.route('key', { path: '/:uid' }, function () { + this.route('edit'); + this.route('delete'); + }); + this.route('new'); }); this.route('tasks', function () { this.route('task', { path: '/:uid' }); diff --git a/app/routes/admin/keys/key/delete.js b/app/routes/admin/keys/key/delete.js new file mode 100644 index 0000000..da3d184 --- /dev/null +++ b/app/routes/admin/keys/key/delete.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class AdminKeysKeyDeleteRoute extends Route {} diff --git a/app/routes/admin/keys/key/edit.js b/app/routes/admin/keys/key/edit.js new file mode 100644 index 0000000..7f08c85 --- /dev/null +++ b/app/routes/admin/keys/key/edit.js @@ -0,0 +1,12 @@ +import Route from '@ember/routing/route'; +// import { hash } from 'rsvp'; + +export default class AdminKeysKeyEditRoute extends Route { + // async model() { + // const key = this.modelFor('admin.admin.keys.key'); + // return hash({ + // key, + // // document: + // }); + // } +} diff --git a/app/routes/admin/keys/key/index.js b/app/routes/admin/keys/key/index.js new file mode 100644 index 0000000..cdb6f17 --- /dev/null +++ b/app/routes/admin/keys/key/index.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class AdminKeysKeyIndexRoute extends Route {} diff --git a/app/routes/admin/keys/new.js b/app/routes/admin/keys/new.js new file mode 100644 index 0000000..e780115 --- /dev/null +++ b/app/routes/admin/keys/new.js @@ -0,0 +1,11 @@ +import Route from '@ember/routing/route'; +import Key from 'meiliadmin/models/key'; + +export default class AdminKeysNewRoute extends Route { + templateName = 'admin.keys.key.edit'; + controllerName = 'admin.keys.key.edit'; + + model() { + return new Key(); + } +} diff --git a/app/services/meilisearch.js b/app/services/meilisearch.js index 07301fa..c8f5528 100644 --- a/app/services/meilisearch.js +++ b/app/services/meilisearch.js @@ -1,5 +1,6 @@ import Service from '@ember/service'; import Index from '../models/index'; +import Key from '../models/key'; import Task from '../models/task'; import query from '../utils/query'; @@ -34,11 +35,20 @@ export default class MeilisearchService extends Service { } getKeys() { - return query('keys'); + return query('keys').then((data) => { + data.results = data.results.map((item) => new Key(item)); + return data; + }); } getKey(uid) { - return query(`keys/${uid}`); + return query(`keys/${uid}`).then((item) => new Key(item)); + } + + deleteKey(uid) { + return query(`keys/${uid}`, { + method: 'DELETE', + }); } getTasks(params, options = {}) { diff --git a/app/templates/admin/keys/index.hbs b/app/templates/admin/keys/index.hbs index 1d55f02..36fb0a5 100644 --- a/app/templates/admin/keys/index.hbs +++ b/app/templates/admin/keys/index.hbs @@ -1,11 +1,19 @@ + + Create new key + + - + - {{data.name}} + {{nu-co data.name data.uid}} + diff --git a/app/templates/admin/keys/key.hbs b/app/templates/admin/keys/key.hbs index 11956aa..0c9c120 100644 --- a/app/templates/admin/keys/key.hbs +++ b/app/templates/admin/keys/key.hbs @@ -1,40 +1,9 @@ - + - - - - - - - {{date-time-format - @model.expiresAt - year='numeric' - month='numeric' - day='numeric' - hour='numeric' - minute='numeric' - second='numeric' - }} - - - {{date-time-format - @model.createdAt - year='numeric' - month='numeric' - day='numeric' - hour='numeric' - minute='numeric' - second='numeric' - }} - - - {{date-time-format - @model.updatedAt - year='numeric' - month='numeric' - day='numeric' - hour='numeric' - minute='numeric' - second='numeric' - }} - + + + + + + +{{outlet}} diff --git a/app/templates/admin/keys/key/delete.hbs b/app/templates/admin/keys/key/delete.hbs new file mode 100644 index 0000000..33faa14 --- /dev/null +++ b/app/templates/admin/keys/key/delete.hbs @@ -0,0 +1,12 @@ +

Are you sure you want to delete this key?

+ +