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 @@
Are you sure you want to delete this key?
+ + + + diff --git a/app/templates/admin/keys/key/edit.hbs b/app/templates/admin/keys/key/edit.hbs new file mode 100644 index 0000000..1fc32ae --- /dev/null +++ b/app/templates/admin/keys/key/edit.hbs @@ -0,0 +1,23 @@ +{{#if @model.isNew}} +