mirror of
https://git.rwth-aachen.de/acs/public/villas/web/
synced 2025-03-09 00:00:01 +01:00
Add project create, delete and store in user data
Change adapter and serializer to REST api. Add session-user to get logged-in user in every controller/route Change models to async relationships, this way the data is only loaded when requested.
This commit is contained in:
parent
9f8a165c69
commit
548bbb5e15
24 changed files with 217 additions and 22 deletions
|
@ -1,8 +1,11 @@
|
|||
import JSONAPIAdapter from 'ember-data/adapters/json-api';
|
||||
import RESTAdapter from 'ember-data/adapters/rest';
|
||||
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';
|
||||
|
||||
export default JSONAPIAdapter.extend(DataAdapterMixin, {
|
||||
export default RESTAdapter.extend(DataAdapterMixin, {
|
||||
host: 'http://192.168.99.100:3000',
|
||||
namespace: 'api/v1',
|
||||
authorizer: 'authorizer:custom'
|
||||
authorizer: 'authorizer:custom',
|
||||
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
|
||||
|
||||
|
||||
});
|
||||
|
|
|
@ -13,6 +13,10 @@ App = Ember.Application.extend({
|
|||
Resolver
|
||||
});
|
||||
|
||||
Ember.RSVP.on('error', function(error) {
|
||||
console.error(error.message);
|
||||
});
|
||||
|
||||
loadInitializers(App, config.modulePrefix);
|
||||
|
||||
export default App;
|
||||
|
|
|
@ -32,9 +32,9 @@ export default Base.extend({
|
|||
});
|
||||
});
|
||||
}, function(xhr) {
|
||||
var response = xhr.responseText;
|
||||
var response = JSON.parse(xhr.responseText);
|
||||
Ember.run(function() {
|
||||
reject(response);
|
||||
reject(response.message);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
32
app/controllers/project/delete.js
Normal file
32
app/controllers/project/delete.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
sessionUser: Ember.inject.service('session-user'),
|
||||
|
||||
actions: {
|
||||
cancelDelete() {
|
||||
// go back to project view
|
||||
let projectId = this.get('model.id');
|
||||
this.transitionToRoute('/project/' + projectId);
|
||||
},
|
||||
|
||||
confirmDelete() {
|
||||
// get current user object
|
||||
var userId = this.get('sessionUser.user.id');
|
||||
var user = this.store.peekRecord('user', userId);
|
||||
|
||||
// get the project
|
||||
var project = this.get('model');
|
||||
let projectId = project.get('id');
|
||||
|
||||
// delete the project and remove from user projects
|
||||
user.get('projects').removeObject(projectId);
|
||||
user.save();
|
||||
|
||||
project.destroyRecord();
|
||||
|
||||
// go back to project list
|
||||
this.transitionToRoute('/projects');
|
||||
}
|
||||
}
|
||||
});
|
|
@ -1,11 +1,36 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
sessionUser: Ember.inject.service('session-user'),
|
||||
|
||||
actions: {
|
||||
newProject() {
|
||||
// create project from form values
|
||||
let properties = this.getProperties('name');
|
||||
// get current user object
|
||||
var userId = this.get('sessionUser.user.id');
|
||||
var user = this.store.peekRecord('user', userId);
|
||||
|
||||
// create new project from properties
|
||||
var properties = this.getProperties('name');
|
||||
properties['owner'] = user;
|
||||
|
||||
var project = this.store.createRecord('project', properties);
|
||||
var controller = this;
|
||||
|
||||
// save the project and user
|
||||
project.save().then(function() {
|
||||
console.log(project.get('id'));
|
||||
|
||||
// add the project to the user
|
||||
user.get('projects').pushObject(project);
|
||||
|
||||
user.save().then(function() {
|
||||
controller.transitionToRoute('/projects');
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
cancelNewProject() {
|
||||
this.transitionToRoute('/projects');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import Model from 'ember-data/model';
|
||||
import attr from 'ember-data/attr';
|
||||
import belongsTo from 'ember-data/relationships';
|
||||
import { belongsTo } from 'ember-data/relationships';
|
||||
|
||||
export default Model.extend({
|
||||
name: attr('string')/*,
|
||||
owner: belongsTo('user')*/
|
||||
name: attr('string'),
|
||||
owner: belongsTo('user', { async: true })
|
||||
});
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import Model from 'ember-data/model';
|
||||
import attr from 'ember-data/attr';
|
||||
import hasMany from 'ember-data/relationships';
|
||||
import { hasMany } from 'ember-data/relationships';
|
||||
|
||||
export default Model.extend({
|
||||
username: attr('string'),
|
||||
password: attr('string'),
|
||||
adminLevel: attr('number')/*,
|
||||
projects: hasMany('project')*/
|
||||
adminLevel: attr('number'),
|
||||
projects: hasMany('project', { async: true })
|
||||
});
|
||||
|
|
|
@ -1,7 +1,25 @@
|
|||
import Ember from 'ember';
|
||||
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';
|
||||
|
||||
const { service } = Ember.inject;
|
||||
|
||||
export default Ember.Route.extend(ApplicationRouteMixin, {
|
||||
sessionUser: service('session-user'),
|
||||
|
||||
beforeModel() {
|
||||
return this._loadCurrentUser();
|
||||
},
|
||||
|
||||
sessionAuthenticated() {
|
||||
this._loadCurrentUser().then(() => {
|
||||
this.transitionTo('/');
|
||||
}).catch(() => this.get('session').invalidate());
|
||||
},
|
||||
|
||||
_loadCurrentUser() {
|
||||
return this.get('sessionUser').loadCurrentUser();
|
||||
},
|
||||
|
||||
actions: {
|
||||
invalidateSession() {
|
||||
this.get('session').invalidate();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import Ember from 'ember';
|
||||
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
export default Ember.Route.extend(UnauthenticatedRouteMixin, {
|
||||
});
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
import Ember from 'ember';
|
||||
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||
model(params) {
|
||||
return this.store.findRecord('project', params.projectid);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import Ember from 'ember';
|
||||
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||
});
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import Ember from 'ember';
|
||||
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||
});
|
||||
|
|
|
@ -2,7 +2,13 @@ import Ember from 'ember';
|
|||
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
|
||||
|
||||
export default Ember.Route.extend(AuthenticatedRouteMixin, {
|
||||
sessionUser: Ember.inject.service('session-user'),
|
||||
|
||||
model() {
|
||||
return this.store.findAll('project');
|
||||
// get session user
|
||||
var userId = this.get('sessionUser.user.id');
|
||||
let user = this.store.peekRecord('user', userId);
|
||||
|
||||
return user.get('projects');
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import JSONSerializer from 'ember-data/serializers/json';
|
||||
import RESTSerializer from 'ember-data/serializers/rest';
|
||||
import DS from 'ember-data';
|
||||
|
||||
export default JSONSerializer.extend({
|
||||
export default RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
|
||||
primaryKey: '_id'
|
||||
});
|
||||
|
|
7
app/serializers/project.js
Normal file
7
app/serializers/project.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import ApplicationSerializer from './application';
|
||||
|
||||
export default ApplicationSerializer.extend({
|
||||
attrs: {
|
||||
owner: { serialize: 'ids' }
|
||||
}
|
||||
});
|
7
app/serializers/user.js
Normal file
7
app/serializers/user.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import ApplicationSerializer from './application';
|
||||
|
||||
export default ApplicationSerializer.extend({
|
||||
attrs: {
|
||||
projects: { serialize: 'ids' }
|
||||
}
|
||||
});
|
25
app/services/session-user.js
Normal file
25
app/services/session-user.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
const {
|
||||
inject: { service },
|
||||
RSVP
|
||||
} = Ember;
|
||||
|
||||
export default Ember.Service.extend({
|
||||
session: service('session'),
|
||||
store: service(),
|
||||
|
||||
loadCurrentUser() {
|
||||
return new RSVP.Promise((resolve, reject) => {
|
||||
const token = this.get('session.data.authenticated.token');
|
||||
if (!Ember.isEmpty(token)) {
|
||||
return this.get('store').findRecord('user', 'me').then((user) => {
|
||||
this.set('user', user);
|
||||
resolve();
|
||||
}, reject);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1 +1,6 @@
|
|||
<h1>Delete Project</h1>
|
||||
|
||||
<p>Are you sure you want to delete the project?</p>
|
||||
|
||||
<button {{action 'cancelDelete'}}>Cancel</button>
|
||||
<button {{action 'confirmDelete'}}>Delete</button>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h1>{{model.name}}</h1>
|
||||
|
||||
{{#link-to "project.edit" model}}Edit project{{/link-to}}
|
||||
{{#link-to "project.delete" model}}Delete project{{/link-to}}
|
||||
{{#link-to "project.edit" model.id}}Edit project{{/link-to}}
|
||||
{{#link-to "project.delete" model.id}}Delete project{{/link-to}}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
{{input id='name' placeholder='Enter project name' value=name}}
|
||||
</p>
|
||||
|
||||
<button {{action 'cancelNewProject'}}>Cancel</button>
|
||||
<button type="submit">Create</button>
|
||||
|
||||
{{#if errorMessage}}
|
||||
|
|
12
tests/unit/controllers/project/delete-test.js
Normal file
12
tests/unit/controllers/project/delete-test.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { moduleFor, test } from 'ember-qunit';
|
||||
|
||||
moduleFor('controller:project/delete', 'Unit | Controller | project/delete', {
|
||||
// Specify the other units that are required for this test.
|
||||
// needs: ['controller:foo']
|
||||
});
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
let controller = this.subject();
|
||||
assert.ok(controller);
|
||||
});
|
15
tests/unit/serializers/project-test.js
Normal file
15
tests/unit/serializers/project-test.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { moduleForModel, test } from 'ember-qunit';
|
||||
|
||||
moduleForModel('project', 'Unit | Serializer | project', {
|
||||
// Specify the other units that are required for this test.
|
||||
needs: ['serializer:project']
|
||||
});
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it serializes records', function(assert) {
|
||||
let record = this.subject();
|
||||
|
||||
let serializedRecord = record.serialize();
|
||||
|
||||
assert.ok(serializedRecord);
|
||||
});
|
15
tests/unit/serializers/user-test.js
Normal file
15
tests/unit/serializers/user-test.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { moduleForModel, test } from 'ember-qunit';
|
||||
|
||||
moduleForModel('user', 'Unit | Serializer | user', {
|
||||
// Specify the other units that are required for this test.
|
||||
needs: ['serializer:user']
|
||||
});
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it serializes records', function(assert) {
|
||||
let record = this.subject();
|
||||
|
||||
let serializedRecord = record.serialize();
|
||||
|
||||
assert.ok(serializedRecord);
|
||||
});
|
12
tests/unit/services/session-user-test.js
Normal file
12
tests/unit/services/session-user-test.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { moduleFor, test } from 'ember-qunit';
|
||||
|
||||
moduleFor('service:session-user', 'Unit | Service | session user', {
|
||||
// Specify the other units that are required for this test.
|
||||
// needs: ['service:foo']
|
||||
});
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
let service = this.subject();
|
||||
assert.ok(service);
|
||||
});
|
Loading…
Add table
Reference in a new issue