1
0
Fork 0
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:
Markus Grigull 2016-06-27 23:22:05 +02:00
parent 9f8a165c69
commit 548bbb5e15
24 changed files with 217 additions and 22 deletions

View file

@ -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' },
});

View file

@ -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;

View file

@ -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);
});
});
});

View 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');
}
}
});

View file

@ -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');
}
}
});

View file

@ -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 })
});

View file

@ -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 })
});

View file

@ -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();

View file

@ -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, {
});

View file

@ -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);
}
});

View file

@ -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, {
});

View file

@ -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, {
});

View file

@ -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');
}
});

View file

@ -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'
});

View file

@ -0,0 +1,7 @@
import ApplicationSerializer from './application';
export default ApplicationSerializer.extend({
attrs: {
owner: { serialize: 'ids' }
}
});

7
app/serializers/user.js Normal file
View file

@ -0,0 +1,7 @@
import ApplicationSerializer from './application';
export default ApplicationSerializer.extend({
attrs: {
projects: { serialize: 'ids' }
}
});

View 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();
}
});
}
});

View file

@ -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>

View file

@ -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}}

View file

@ -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}}

View 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);
});

View 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);
});

View 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);
});

View 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);
});