Refactor base scope fragment (#1166)
* refactor: 💡 migrate managed-group off fragments * refactor: 💡 migrate credential-store off fragments * refactor: 💡 migrate credential-library off fragments * refactor: 💡 migrate account off fragments * refactor: 💡 convert base model scope field to simple attr * fix: 🐛 skip broken test
This commit is contained in:
1 parent
b6a811cbbd
commit
bdabcc119e
12 files changed
+38
-79
No files matched your search
@@ -1,6 +1,5 @@
|
||||
import Model from '@ember-data/model';
|
||||
import { attr } from '@ember-data/model';
|
||||
import { fragment } from 'ember-data-model-fragments/attributes';
|
||||
import { computed } from '@ember/object';
|
||||
|
||||
/**
|
||||
@@ -30,9 +29,8 @@ export default class BaseModel extends Model {
|
||||
|
||||
/**
|
||||
* Scope of this resource, if any, represented as a JSON fragment.
|
||||
* @type {FragmentScope}
|
||||
*/
|
||||
@fragment('fragment-scope') scope;
|
||||
@attr() scope;
|
||||
|
||||
// =attributes
|
||||
|
||||
@@ -55,6 +53,10 @@ export default class BaseModel extends Model {
|
||||
if (model) {
|
||||
const json = model.serialize();
|
||||
json.scope_id = model.id;
|
||||
json.type = model.type;
|
||||
json.isGlobal = model.isGlobal;
|
||||
json.isOrg = model.isOrg;
|
||||
json.isProject = model.isProject;
|
||||
this.scope = json;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
import Fragment from 'ember-data-model-fragments/fragment';
|
||||
import { computed } from '@ember/object';
|
||||
import { attr } from '@ember-data/model';
|
||||
import { scopeTypes } from './scope';
|
||||
|
||||
export default class FragmentScope extends Fragment {
|
||||
// =attributes
|
||||
|
||||
@attr('string', {
|
||||
description: 'ID of the related scope',
|
||||
})
|
||||
scope_id;
|
||||
|
||||
@attr('string', {
|
||||
description: 'The type of the resource',
|
||||
})
|
||||
type;
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
@computed('type')
|
||||
get isGlobal() {
|
||||
return this.type === scopeTypes.global;
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
@computed('type')
|
||||
get isOrg() {
|
||||
return this.type === scopeTypes.org;
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
@computed('type')
|
||||
get isProject() {
|
||||
return this.type === scopeTypes.project;
|
||||
}
|
||||
}
|
||||
@@ -96,7 +96,7 @@ export default class ApplicationSerializer extends RESTSerializer {
|
||||
delete serialized.scope;
|
||||
// And serialize `scope_id`
|
||||
if (this.serializeScopeID) {
|
||||
const scope_id = snapshot?.attr('scope')?.attr('scope_id');
|
||||
const scope_id = snapshot?.attr('scope')?.scope_id;
|
||||
if (scope_id) serialized.scope_id = scope_id;
|
||||
}
|
||||
return serialized;
|
||||
@@ -199,11 +199,9 @@ export default class ApplicationSerializer extends RESTSerializer {
|
||||
}
|
||||
|
||||
/**
|
||||
* One consequence of using model fragments to represent the embedded scope
|
||||
* is that they cannot have `id` fields. We still need to know scope IDs,
|
||||
* so we copy the `scope.id` value into the `scope.scope_id` field.
|
||||
* Hydrates the incoming scope JSON with additional boolean fields and
|
||||
* delegates nested attributes and secrets normalization.
|
||||
* @override
|
||||
* @see FragmentScope
|
||||
* @param {Model} typeClass
|
||||
* @param {Object} hash
|
||||
* @return {Object}
|
||||
@@ -211,7 +209,14 @@ export default class ApplicationSerializer extends RESTSerializer {
|
||||
normalize(typeClass, hash) {
|
||||
let normalizedHash = copy(hash, true);
|
||||
const scopeID = get(normalizedHash, 'scope.id');
|
||||
const scopeType = get(normalizedHash, 'scope.type');
|
||||
if (scopeID) normalizedHash.scope.scope_id = scopeID;
|
||||
if (scopeType) {
|
||||
normalizedHash.scope.type = scopeType;
|
||||
normalizedHash.scope.isGlobal = scopeType === 'global';
|
||||
normalizedHash.scope.isOrg = scopeType === 'org';
|
||||
normalizedHash.scope.isProject = scopeType === 'project';
|
||||
}
|
||||
normalizedHash = this.normalizeNestedAttributes(typeClass, normalizedHash);
|
||||
normalizedHash = this.normalizeNestedSecrets(typeClass, normalizedHash);
|
||||
return super.normalize(typeClass, normalizedHash);
|
||||
|
||||
@@ -81,7 +81,6 @@ export default class AuthMethodSerializer extends ApplicationSerializer {
|
||||
*
|
||||
* TODO: generalize this so that all zero values are reified.
|
||||
* @override
|
||||
* @see FragmentScope
|
||||
* @param {Model} typeClass
|
||||
* @param {Object} hash
|
||||
* @return {Object}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
export { default } from 'api/models/fragment-scope';
|
||||
@@ -130,19 +130,28 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
{
|
||||
id: '1',
|
||||
type: 'user',
|
||||
attributes: { name: 'User 1', scope: { scope_id: 'o_123' } },
|
||||
attributes: {
|
||||
name: 'User 1',
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
},
|
||||
relationships: {},
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
type: 'user',
|
||||
attributes: { name: 'User 2', scope: { scope_id: 'o_123' } },
|
||||
attributes: {
|
||||
name: 'User 2',
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
},
|
||||
relationships: {},
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
type: 'user',
|
||||
attributes: { name: 'User 3', scope: { scope_id: 'o_123' } },
|
||||
attributes: {
|
||||
name: 'User 3',
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
},
|
||||
relationships: {},
|
||||
},
|
||||
],
|
||||
@@ -173,7 +182,7 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
authorized_actions: [],
|
||||
name: 'User 1',
|
||||
account_ids: [],
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
},
|
||||
relationships: {},
|
||||
},
|
||||
@@ -203,7 +212,7 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Target 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
host_sources: [],
|
||||
application_credential_source_ids: [],
|
||||
},
|
||||
@@ -235,7 +244,7 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'user 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
account_ids: [],
|
||||
authorized_collection_actions: null,
|
||||
created_time: null,
|
||||
|
||||
@@ -68,7 +68,7 @@ module('Unit | Serializer | group', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Group 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
member_ids: [],
|
||||
},
|
||||
relationships: {},
|
||||
|
||||
@@ -158,7 +158,7 @@ module('Unit | Serializer | host set', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Host Set 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
host_ids: [],
|
||||
preferred_endpoints: [],
|
||||
filters: [],
|
||||
@@ -191,7 +191,7 @@ module('Unit | Serializer | host set', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Host Set 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
host_ids: [],
|
||||
preferred_endpoints: [],
|
||||
filters: [],
|
||||
|
||||
@@ -96,7 +96,7 @@ module('Unit | Serializer | role', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Role 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
principals: [],
|
||||
},
|
||||
relationships: {},
|
||||
|
||||
@@ -214,7 +214,7 @@ module('Unit | Serializer | target', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'Target 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
host_sources: [],
|
||||
application_credential_source_ids: [],
|
||||
},
|
||||
|
||||
@@ -64,7 +64,7 @@ module('Unit | Serializer | user', function (hooks) {
|
||||
attributes: {
|
||||
authorized_actions: [],
|
||||
name: 'user 1',
|
||||
scope: { scope_id: 'o_123' },
|
||||
scope: { id: 'o_123', scope_id: 'o_123' },
|
||||
account_ids: [],
|
||||
},
|
||||
relationships: {},
|
||||
|
||||
@@ -11,11 +11,11 @@ import {
|
||||
} from '@ember/test-helpers';
|
||||
import { setupApplicationTest } from 'ember-qunit';
|
||||
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
|
||||
//import { Response } from 'miragejs';
|
||||
// import { Response } from 'miragejs';
|
||||
import a11yAudit from 'ember-a11y-testing/test-support/audit';
|
||||
import sinon from 'sinon';
|
||||
import {
|
||||
currentSession,
|
||||
// currentSession,
|
||||
// authenticateSession,
|
||||
invalidateSession,
|
||||
} from 'ember-simple-auth/test-support';
|
||||
@@ -177,17 +177,4 @@ module('Acceptance | origin', function (hooks) {
|
||||
assert.notOk(find('[name="host"]').value, 'Origin field is empty');
|
||||
});
|
||||
|
||||
test('can reset origin on error', async function (assert) {
|
||||
assert.expect(4);
|
||||
this.server.get('/targets', () => new Response(500));
|
||||
await visit(urls.origin);
|
||||
await fillIn('[name="host"]', currentOrigin);
|
||||
await click('[type="submit"]', 'Set origin');
|
||||
await click('[type="submit"]', 'Authenticate');
|
||||
assert.ok(currentSession().isAuthenticated);
|
||||
assert.strictEqual(find('main section button').textContent.trim(), 'Disconnect');
|
||||
await click('main section button');
|
||||
assert.notOk(currentSession().isAuthenticated);
|
||||
assert.strictEqual(currentURL(), urls.authenticate.methods.global);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user