Skip to content

Commit 628af85

Browse files
committed
profile: subscriptions
1 parent 30bdc96 commit 628af85

14 files changed

Lines changed: 141 additions & 10 deletions

File tree

handlers/newsletter/controllers/frontpage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ exports.get = function*() {
2323
} else if (this.user) {
2424
subscription = yield Subscription.findOne({
2525
email: this.user.email
26-
}).exec();
26+
});
2727
}
2828

2929
this.locals.email = subscription ? subscription.email :

handlers/newsletter/controllers/subscribe.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const path = require('path');
44
const Newsletter = require('../models/newsletter');
55
const Subscription = require('../models/subscription');
66
const SubscriptionAction = require('../models/subscriptionAction');
7-
const sendMail = require('mailer').send;
87
const config = require('config');
98
const _ = require('lodash');
109
const notify = require('../lib/notify');
@@ -24,6 +23,10 @@ const ACTION_REMOVE = 'remove';
2423
*/
2524
exports.post = function*() {
2625

26+
yield function(cb) {
27+
setTimeout(cb, 5000);
28+
};
29+
2730
var self = this;
2831

2932
var subscription;
@@ -33,7 +36,7 @@ exports.post = function*() {
3336
if (this.request.body.accessKey) {
3437
subscription = yield Subscription.findOne({
3538
accessKey: this.request.body.accessKey
36-
}).exec();
39+
});
3740
if (!subscription) {
3841
this.throw(404, "Нет такой подписки.");
3942
}
@@ -43,7 +46,7 @@ exports.post = function*() {
4346
}
4447
subscription = yield Subscription.findOne({
4548
email: this.request.body.email
46-
}).exec();
49+
});
4750
}
4851

4952
var email = subscription ? subscription.email : this.request.body.email;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"use strict";
2+
3+
const Newsletter = require('../models/newsletter');
4+
const Subscription = require('../models/subscription');
5+
const _ = require('lodash');
6+
7+
/**
8+
* The order form is sent to checkout when it's 100% valid (client-side code validated it)
9+
* It uses order.module.createOrderFromTemplate to create an order, it can throw if something's wrong
10+
* the order CANNOT be changed after submitting to payment
11+
* @param next
12+
*/
13+
exports.get = function*(next) {
14+
15+
var user = this.userById;
16+
17+
if (!this.user._id.equals(user._id) && !this.isAdmin) {
18+
this.throw(403);
19+
}
20+
21+
var subscription = yield Subscription.findOne({
22+
email: this.user.email
23+
});
24+
25+
26+
var newsletters = yield Newsletter.find({}).sort({weight: 1}).exec();
27+
28+
var newslettersFormatted = newsletters.map(function(newsletter) {
29+
return {
30+
slug: newsletter.slug,
31+
title: newsletter.title,
32+
period: newsletter.period,
33+
// mongoose array can #indexOf ObjectIds
34+
subscribed: Boolean(subscription && ~subscription.newsletters.indexOf(newsletter._id))
35+
};
36+
});
37+
38+
39+
this.body = newslettersFormatted;
40+
41+
};
42+
43+

handlers/newsletter/router.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
var Router = require('koa-router');
2+
var mustBeAuthenticated = require('auth').mustBeAuthenticated;
23

34
var action = require('./controllers/action');
45
var frontpage = require('./controllers/frontpage');
56
//var subscriptions = require('./controllers/subscriptions');
67
var subscribe = require('./controllers/subscribe');
78

89
var router = module.exports = new Router();
10+
router.param('userById', require('users').routeUserById);
911

1012
router.post("/subscribe", subscribe.post);
1113
router.get("/", frontpage.get);
@@ -14,3 +16,6 @@ router.get("/action/:accessKey", action.get);
1416

1517
router.get("/subscriptions/:accessKey", frontpage.get);
1618

19+
// for profile
20+
router.get('/profile/:userById', mustBeAuthenticated, require('./controllers/subscriptionsByUser').get);
21+

handlers/profile/client/config.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ angular.module('profile').config(($locationProvider, $stateProvider, $urlRouterP
4343
quizResults: /*@ngInject*/ (QuizResults) => QuizResults.query()
4444
}
4545
},
46+
'root.subscriptions': {
47+
url: '/subscriptions',
48+
title: 'Уведомления',
49+
templateUrl: "/profile/templates/partials/subscriptions",
50+
controller: 'ProfileSubscriptionsCtrl',
51+
resolve: {
52+
newsletters: /*@ngInject*/ (Newsletters) => Newsletters.query()
53+
}
54+
},
4655
'root.orders': {
4756
url: '/orders',
4857
title: 'Заказы',

handlers/profile/client/controller/root.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ profile.controller('ProfileRootCtrl', ($scope, $state, $timeout, $http, me, prom
77

88
$scope.loadingTracker = promiseTracker();
99

10-
var tabs = ['root.aboutme', 'root.account'];
10+
var tabs = ['root.aboutme', 'root.account', 'root.subscriptions'];
1111
window.currentUser.profileTabsEnabled.forEach(function(tab) {
1212
tabs.push('root.' + tab);
1313
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
var angular = require('angular');
2+
var notification = require('client/notification');
3+
4+
//var newsletter = require('newsletter/client');
5+
6+
var profile = angular.module('profile');
7+
8+
profile.controller('ProfileSubscriptionsCtrl', ($scope, $http, me, newsletters) => {
9+
10+
$scope.newsletters = newsletters;
11+
12+
$scope.submit = function() {
13+
var body = {
14+
email: me.email,
15+
slug: newsletters.filter(nl => nl.subscribed).map(nl => nl.slug),
16+
replace: true
17+
};
18+
19+
$http({
20+
method: 'POST',
21+
url: '/newsletter/subscribe',
22+
tracker: $scope.loadingTracker,
23+
headers: {'Content-Type': 'application/json'},
24+
transformRequest: angular.identity,
25+
data: JSON.stringify(body)
26+
}).then((response) => {
27+
28+
new notification.Success('Настройки обновлены.');
29+
30+
}, (response) => {
31+
new notification.Error("Ошибка загрузки, статус " + response.status);
32+
});
33+
};
34+
35+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
var angular = require('angular');
2+
3+
angular.module('profile').factory('Newsletters', ($resource) => {
4+
return $resource('/newsletter/profile/' + window.currentUser.id, {}, {
5+
query: {
6+
method: 'GET',
7+
isArray: true,
8+
transformResponse: function(data) {
9+
data = JSON.parse(data);
10+
return data;
11+
}
12+
}
13+
});
14+
});

handlers/profile/client/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ require('./directive/dateRangeValidator');
1919
require('./factory/me');
2020

2121
require('./factory/quizResults');
22-
2322
require('./factory/orders');
23+
require('./factory/newsletters');
2424
require('./factory/courseGroups');
2525

2626
require('./config');
@@ -33,6 +33,8 @@ require('./controller/courseGroups');
3333

3434
require('./controller/aboutme');
3535

36+
require('./controller/subscriptions');
37+
3638
require('./controller/quizResults');
3739

3840
require('./controller/account');

handlers/profile/controller/index.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
var config = require('config');
22
var User = require('users').User;
3-
var mongoose = require('mongoose');
4-
var QuizResult = require('quiz').QuizResult;
5-
var Order = require('payments').Order;
63

74
// skips the request unless it's the owner
85
exports.get = function* (next) {
@@ -19,7 +16,7 @@ exports.get = function* (next) {
1916
return;
2017
}
2118

22-
var user = yield User.findOne({profileName: this.params.profileName}).exec();
19+
var user = yield User.findOne({profileName: this.params.profileName});
2320

2421
if (!user) {
2522
this.throw(404);

0 commit comments

Comments
 (0)