From a799c194e8fa3cf9c92783178074e544d7d05495 Mon Sep 17 00:00:00 2001 From: Stanislav Romanov Date: Mon, 19 Sep 2022 11:21:50 +0300 Subject: [PATCH 1/5] Refactore keys list --- app/templates/admin/keys/key.hbs | 61 ++++++++++++-------------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/app/templates/admin/keys/key.hbs b/app/templates/admin/keys/key.hbs index 11956aa..b631cac 100644 --- a/app/templates/admin/keys/key.hbs +++ b/app/templates/admin/keys/key.hbs @@ -1,40 +1,25 @@ - - - - - - - {{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' - }} - + + + {{!-- --}} + {{!-- --}} + + +{{#each + (array + 'description' + 'key' + 'uid' + 'actions' + 'indexes' + 'expiresAt' + 'createdAt' + 'updatedAt' + ) + as |key| +}} + {{#if (get @model key)}} + + {{/if}} +{{/each}} From cc0c17a5a35a7c9737bdc344e45e81b5f95b69e6 Mon Sep 17 00:00:00 2001 From: Stanislav Romanov Date: Mon, 19 Sep 2022 13:22:29 +0300 Subject: [PATCH 2/5] Add edit form --- app/controllers/admin/keys/key/edit.js | 46 +++++++++++++++++++ app/models/key.js | 43 +++++++++++++++++ app/router.js | 4 +- app/routes/admin/keys/key/edit.js | 13 ++++++ app/routes/admin/keys/key/index.js | 3 ++ app/services/meilisearch.js | 8 +++- app/templates/admin/keys/key.hbs | 22 ++------- app/templates/admin/keys/key/edit.hbs | 19 ++++++++ app/templates/admin/keys/key/index.hbs | 17 +++++++ .../controllers/admin/keys/key/edit-test.js | 12 +++++ tests/unit/routes/admin/keys/key/edit-test.js | 11 +++++ .../unit/routes/admin/keys/key/index-test.js | 11 +++++ 12 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 app/controllers/admin/keys/key/edit.js create mode 100644 app/models/key.js create mode 100644 app/routes/admin/keys/key/edit.js create mode 100644 app/routes/admin/keys/key/index.js create mode 100644 app/templates/admin/keys/key/edit.hbs create mode 100644 app/templates/admin/keys/key/index.hbs create mode 100644 tests/unit/controllers/admin/keys/key/edit-test.js create mode 100644 tests/unit/routes/admin/keys/key/edit-test.js create mode 100644 tests/unit/routes/admin/keys/key/index-test.js diff --git a/app/controllers/admin/keys/key/edit.js b/app/controllers/admin/keys/key/edit.js new file mode 100644 index 0000000..db2dd4c --- /dev/null +++ b/app/controllers/admin/keys/key/edit.js @@ -0,0 +1,46 @@ +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); + + 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..73c3f5c --- /dev/null +++ b/app/models/key.js @@ -0,0 +1,43 @@ +import query from '../utils/query'; + +export default class Key { + 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..3b12d73 100644 --- a/app/router.js +++ b/app/router.js @@ -25,7 +25,9 @@ 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('tasks', function () { this.route('task', { path: '/:uid' }); diff --git a/app/routes/admin/keys/key/edit.js b/app/routes/admin/keys/key/edit.js new file mode 100644 index 0000000..56a63ed --- /dev/null +++ b/app/routes/admin/keys/key/edit.js @@ -0,0 +1,13 @@ +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/services/meilisearch.js b/app/services/meilisearch.js index 07301fa..8772538 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,14 @@ 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)); } getTasks(params, options = {}) { diff --git a/app/templates/admin/keys/key.hbs b/app/templates/admin/keys/key.hbs index b631cac..900d53b 100644 --- a/app/templates/admin/keys/key.hbs +++ b/app/templates/admin/keys/key.hbs @@ -1,25 +1,9 @@ - - {{!-- --}} + + {{!-- --}} -{{#each - (array - 'description' - 'key' - 'uid' - 'actions' - 'indexes' - 'expiresAt' - 'createdAt' - 'updatedAt' - ) - as |key| -}} - {{#if (get @model key)}} - - {{/if}} -{{/each}} +{{outlet}} diff --git a/app/templates/admin/keys/key/edit.hbs b/app/templates/admin/keys/key/edit.hbs new file mode 100644 index 0000000..f7607ae --- /dev/null +++ b/app/templates/admin/keys/key/edit.hbs @@ -0,0 +1,19 @@ +
+ + + + +
diff --git a/app/templates/admin/keys/key/index.hbs b/app/templates/admin/keys/key/index.hbs new file mode 100644 index 0000000..9f77440 --- /dev/null +++ b/app/templates/admin/keys/key/index.hbs @@ -0,0 +1,17 @@ +{{#each + (array + 'description' + 'key' + 'uid' + 'actions' + 'indexes' + 'expiresAt' + 'createdAt' + 'updatedAt' + ) + as |key| +}} + {{#if (get @model key)}} + + {{/if}} +{{/each}} diff --git a/tests/unit/controllers/admin/keys/key/edit-test.js b/tests/unit/controllers/admin/keys/key/edit-test.js new file mode 100644 index 0000000..f6abfc9 --- /dev/null +++ b/tests/unit/controllers/admin/keys/key/edit-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'meiliadmin/tests/helpers'; + +module('Unit | Controller | admin/keys/key/edit', function (hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function (assert) { + let controller = this.owner.lookup('controller:admin/keys/key/edit'); + assert.ok(controller); + }); +}); diff --git a/tests/unit/routes/admin/keys/key/edit-test.js b/tests/unit/routes/admin/keys/key/edit-test.js new file mode 100644 index 0000000..d8e94f3 --- /dev/null +++ b/tests/unit/routes/admin/keys/key/edit-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'meiliadmin/tests/helpers'; + +module('Unit | Route | admin/keys/key/edit', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let route = this.owner.lookup('route:admin/keys/key/edit'); + assert.ok(route); + }); +}); diff --git a/tests/unit/routes/admin/keys/key/index-test.js b/tests/unit/routes/admin/keys/key/index-test.js new file mode 100644 index 0000000..3845a84 --- /dev/null +++ b/tests/unit/routes/admin/keys/key/index-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'meiliadmin/tests/helpers'; + +module('Unit | Route | admin/keys/key/index', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let route = this.owner.lookup('route:admin/keys/key/index'); + assert.ok(route); + }); +}); From 4191311ecf229d53f25e458649b4975711d21be5 Mon Sep 17 00:00:00 2001 From: Stanislav Romanov Date: Mon, 19 Sep 2022 13:35:56 +0300 Subject: [PATCH 3/5] Add creation of key --- app/controllers/admin/keys/key/edit.js | 5 ++++- app/models/key.js | 6 ++++++ app/router.js | 1 + app/routes/admin/keys/key/edit.js | 1 - app/routes/admin/keys/new.js | 11 +++++++++++ app/templates/admin/keys/index.hbs | 7 +++++++ app/templates/admin/keys/key/edit.hbs | 4 ++++ app/templates/admin/keys/new.hbs | 1 + tests/unit/routes/admin/keys/new-test.js | 11 +++++++++++ 9 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 app/routes/admin/keys/new.js create mode 100644 app/templates/admin/keys/new.hbs create mode 100644 tests/unit/routes/admin/keys/new-test.js diff --git a/app/controllers/admin/keys/key/edit.js b/app/controllers/admin/keys/key/edit.js index db2dd4c..5345537 100644 --- a/app/controllers/admin/keys/key/edit.js +++ b/app/controllers/admin/keys/key/edit.js @@ -26,7 +26,10 @@ export default class AdminKeysKeyEditController extends Controller { try { const key = await this.model.save(value); - await this.router.refresh('admin.keys.key', key.uid); + 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; diff --git a/app/models/key.js b/app/models/key.js index 73c3f5c..ee4e273 100644 --- a/app/models/key.js +++ b/app/models/key.js @@ -1,6 +1,12 @@ 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]; diff --git a/app/router.js b/app/router.js index 3b12d73..a03a68c 100644 --- a/app/router.js +++ b/app/router.js @@ -28,6 +28,7 @@ Router.map(function () { this.route('key', { path: '/:uid' }, function () { this.route('edit'); }); + this.route('new'); }); this.route('tasks', function () { this.route('task', { path: '/:uid' }); diff --git a/app/routes/admin/keys/key/edit.js b/app/routes/admin/keys/key/edit.js index 56a63ed..7f08c85 100644 --- a/app/routes/admin/keys/key/edit.js +++ b/app/routes/admin/keys/key/edit.js @@ -4,7 +4,6 @@ import Route from '@ember/routing/route'; 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/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/templates/admin/keys/index.hbs b/app/templates/admin/keys/index.hbs index 1d55f02..42a5fea 100644 --- a/app/templates/admin/keys/index.hbs +++ b/app/templates/admin/keys/index.hbs @@ -1,5 +1,12 @@ + + Create new key + + diff --git a/app/templates/admin/keys/key/edit.hbs b/app/templates/admin/keys/key/edit.hbs index f7607ae..1fc32ae 100644 --- a/app/templates/admin/keys/key/edit.hbs +++ b/app/templates/admin/keys/key/edit.hbs @@ -1,3 +1,7 @@ +{{#if @model.isNew}} + +{{/if}} +
Date: Mon, 19 Sep 2022 13:40:16 +0300 Subject: [PATCH 4/5] Show uid if name is empty --- app/templates/admin/keys/index.hbs | 5 +++-- app/templates/admin/keys/key.hbs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/templates/admin/keys/index.hbs b/app/templates/admin/keys/index.hbs index 42a5fea..36fb0a5 100644 --- a/app/templates/admin/keys/index.hbs +++ b/app/templates/admin/keys/index.hbs @@ -8,11 +8,12 @@ - + - {{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 900d53b..27cabae 100644 --- a/app/templates/admin/keys/key.hbs +++ b/app/templates/admin/keys/key.hbs @@ -1,4 +1,4 @@ - + From d773bf51b6fd44991f3f31cddba5b7ab2507c617 Mon Sep 17 00:00:00 2001 From: Stanislav Romanov Date: Mon, 19 Sep 2022 13:57:46 +0300 Subject: [PATCH 5/5] Add deleting key --- app/controllers/admin/keys/key/delete.js | 26 +++++++++++++++++++ app/router.js | 1 + app/routes/admin/keys/key/delete.js | 3 +++ app/services/meilisearch.js | 6 +++++ app/templates/admin/keys/key.hbs | 2 +- app/templates/admin/keys/key/delete.hbs | 12 +++++++++ app/utils/query.js | 4 ++- .../controllers/admin/keys/key/delete-test.js | 12 +++++++++ .../unit/routes/admin/keys/key/delete-test.js | 11 ++++++++ 9 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 app/controllers/admin/keys/key/delete.js create mode 100644 app/routes/admin/keys/key/delete.js create mode 100644 app/templates/admin/keys/key/delete.hbs create mode 100644 tests/unit/controllers/admin/keys/key/delete-test.js create mode 100644 tests/unit/routes/admin/keys/key/delete-test.js 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/router.js b/app/router.js index a03a68c..7e1fbc3 100644 --- a/app/router.js +++ b/app/router.js @@ -27,6 +27,7 @@ Router.map(function () { this.route('keys', function () { this.route('key', { path: '/:uid' }, function () { this.route('edit'); + this.route('delete'); }); this.route('new'); }); 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/services/meilisearch.js b/app/services/meilisearch.js index 8772538..c8f5528 100644 --- a/app/services/meilisearch.js +++ b/app/services/meilisearch.js @@ -45,6 +45,12 @@ export default class MeilisearchService extends Service { return query(`keys/${uid}`).then((item) => new Key(item)); } + deleteKey(uid) { + return query(`keys/${uid}`, { + method: 'DELETE', + }); + } + getTasks(params, options = {}) { // Clear from undefined fields Object.keys(params).forEach((key) => params[key] ?? delete params[key]); diff --git a/app/templates/admin/keys/key.hbs b/app/templates/admin/keys/key.hbs index 27cabae..0c9c120 100644 --- a/app/templates/admin/keys/key.hbs +++ b/app/templates/admin/keys/key.hbs @@ -3,7 +3,7 @@ - {{!-- --}} + {{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?

+ +