Skip to content

Commit 8da655f

Browse files
committed
now subscriptions collection only contains confirmed subscriptions, all confirmations are in subscriptionActions
1 parent 0c4c5a2 commit 8da655f

13 files changed

Lines changed: 53 additions & 282 deletions

File tree

handlers/newsletter/controllers/action.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ exports.get = function*() {
1414
this.throw(404);
1515
}
1616

17-
yield subscriptionAction.apply();
17+
var subscription = yield subscriptionAction.apply();
1818

1919
if (subscriptionAction.action == 'remove') {
2020
this.body = this.render('removed');
2121
return;
2222
}
2323

2424
this.addFlashMessage('success', 'Подписка подтверждена.');
25-
this.redirect('/newsletter/subscriptions/' + this.params.accessKey);
25+
this.redirect('/newsletter/subscriptions/' + subscription.accessKey);
2626

2727
};

handlers/newsletter/controllers/frontpage.js

Lines changed: 3 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ const config = require('config');
88
const _ = require('lodash');
99

1010
exports.get = function*() {
11-
console.log("HERE");
1211
this.nocache();
1312

1413
var subscription;
@@ -27,6 +26,9 @@ exports.get = function*() {
2726
}).exec();
2827
}
2928

29+
this.locals.email = subscription ? subscription.email :
30+
this.user ? this.user.email : null;
31+
3032
this.locals.accessKey = this.params.accessKey;
3133
this.locals.subscription = subscription;
3234

@@ -46,84 +48,3 @@ exports.get = function*() {
4648

4749
};
4850

49-
/*
50-
exports.post = function*() {
51-
52-
var slugs = this.request.body.slug || [];
53-
54-
if (!Array.isArray(slugs)) {
55-
slugs = [slugs];
56-
}
57-
slugs = slugs.map(String);
58-
59-
if (this.user) {
60-
// for auth user subscribe w/o confirmations
61-
let subscription = yield Subscription.findOne({
62-
email: this.user.email
63-
}).exec();
64-
65-
if (subscription && this.request.body.remove) {
66-
yield subscription.destroy();
67-
this.body = this.render('removed');
68-
return;
69-
}
70-
71-
if (!subscription) {
72-
subscription = new Subscription({
73-
email: this.user.email,
74-
newsletters: []
75-
});
76-
}
77-
78-
// maybe subscription for this user exists and is unconfirmed?
79-
// then make it confirmed, cause auth user submits it
80-
subscription.confirmed = true;
81-
82-
let newsletters = yield Newsletter.find({
83-
slug: {
84-
$in: slugs
85-
}
86-
}).exec();
87-
88-
subscription.newsletters = _.pluck(newsletters, '_id');
89-
90-
yield subscription.persist();
91-
92-
this.addFlashMessage('success', "Настройки обновлены.");
93-
94-
this.redirect('/newsletter');
95-
return;
96-
}
97-
98-
// for anon user we must request confirmation
99-
let subscription = yield Subscription.findOne({
100-
accessKey: this.params.accessKey
101-
}).exec();
102-
103-
if (!subscription) {
104-
this.throw(404, "Нет такой подписки.");
105-
}
106-
107-
if (this.request.body.remove) {
108-
yield subscription.destroy();
109-
this.body = this.render('removed');
110-
return;
111-
}
112-
113-
var newsletters = yield Newsletter.find({
114-
slug: {
115-
$in: slugs
116-
}
117-
}).exec();
118-
119-
subscription.newsletters = _.pluck(newsletters, '_id');
120-
121-
yield subscription.persist();
122-
123-
this.addFlashMessage('success', "Настройки обновлены.");
124-
125-
this.redirect('/newsletter/subscriptions/' + this.params.accessKey);
126-
127-
};
128-
129-
*/

handlers/newsletter/controllers/subscribe.js

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,10 @@ exports.post = function*() {
2626

2727
var self = this;
2828

29-
var slugs = (function readSlugs(request) {
30-
var slugs = request.body.slug || [];
31-
32-
if (!Array.isArray(slugs)) {
33-
slugs = [slugs];
34-
}
35-
slugs = slugs.map(String);
36-
return slugs;
37-
})(this.request);
38-
39-
const newsletters = yield Newsletter.find({
40-
slug: {
41-
$in: slugs
42-
}
43-
}).exec();
44-
45-
const newsletterIds = _.pluck(newsletters, '_id');
46-
47-
if (!newsletters.length) {
48-
this.throw(404, "Нет такой рассылки");
49-
}
50-
51-
// important:
52-
// remove has priority, because may come with (default) replace
53-
var action = this.request.body.remove ? ACTION_REMOVE :
54-
this.request.body.replace ? ACTION_REPLACE : ACTION_ADD;
55-
5629
var subscription;
5730

31+
// read subscription first
32+
// if no subscription, error must come first before any other errors
5833
if (this.request.body.accessKey) {
5934
subscription = yield Subscription.findOne({
6035
accessKey: this.request.body.accessKey
@@ -73,6 +48,16 @@ exports.post = function*() {
7348

7449
var email = subscription ? subscription.email : this.request.body.email;
7550

51+
52+
// may be empty (e.g. for remove request)
53+
var newsletterIds = yield readNewsletterIds.call(this);
54+
55+
// important:
56+
// remove has priority, because may come with (default) replace
57+
var action = this.request.body.remove ? ACTION_REMOVE :
58+
this.request.body.replace ? ACTION_REPLACE : ACTION_ADD;
59+
60+
7661
// full access if user for himself OR accessKey is given
7762
var isFullAccess = this.user && this.user.email == this.request.body.email ||
7863
subscription && subscription.accessKey == this.request.body.accessKey;
@@ -113,10 +98,11 @@ exports.post = function*() {
11398
newsletters: newsletterIds
11499
});
115100

116-
yield* subscriptionAction.apply();
101+
subscription = yield* subscriptionAction.apply();
117102

118103
if (action == ACTION_REMOVE) {
119-
return respond(`Адрес ${email} удалён из базы подписок`);
104+
respond(`Адрес ${email} удалён из базы подписок.`);
105+
return;
120106
}
121107

122108
if (subscription) {
@@ -138,7 +124,7 @@ exports.post = function*() {
138124
});
139125
yield notify(subscriptionAction);
140126
}
141-
respond(`На адрес ${email} направлен запрос подтверждения.`);
127+
respond(`На адрес ${email}, если он был подписан, направлен запрос подтверждения.`);
142128
return;
143129
}
144130

@@ -156,3 +142,25 @@ exports.post = function*() {
156142

157143
};
158144

145+
146+
function* readNewsletterIds() {
147+
var slugs = (function readSlugs(request) {
148+
var slugs = request.body.slug || [];
149+
150+
if (!Array.isArray(slugs)) {
151+
slugs = [slugs];
152+
}
153+
slugs = slugs.map(String);
154+
return slugs;
155+
})(this.request);
156+
157+
const newsletters = yield Newsletter.find({
158+
slug: {
159+
$in: slugs
160+
}
161+
}).exec();
162+
163+
const newsletterIds = _.pluck(newsletters, '_id');
164+
165+
return newsletterIds;
166+
}

handlers/newsletter/controllers/subscriptions.js

Lines changed: 0 additions & 79 deletions
This file was deleted.

handlers/newsletter/models/subscriptionAction.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ const schema = new Schema({
3030
email: {
3131
type: String,
3232
required: true,
33-
unique: true,
3433
validate: [
3534
{
3635
validator: function checkEmail(value) {

handlers/newsletter/tasks/createLetters.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ module.exports = function(options) {
5555
var subscriptions = yield Subscription.find({
5656
newsletters: {
5757
$in: newsletters.map(function(n) { return n._id; })
58-
},
59-
confirmed: true
58+
}
6059
}, {email: true, newsletters: true, accessKey: true, _id: false}).exec();
6160

6261

handlers/newsletter/templates/confirm.jade

Lines changed: 0 additions & 14 deletions
This file was deleted.

handlers/newsletter/templates/frontpage.jade

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@ block content
1616
padding: 0;
1717
}
1818

19-
//- subscription can come from accessKey or current user
20-
if subscription
21-
p Управление подписками для #{subscription.email}.
22-
else
23-
p Ваш email:
19+
form(method="POST", action="/newsletter/subscribe")
2420

25-
input(type="email", name="email", placeholder="[email protected]" style="font-size:125%")
21+
//- subscription can come from accessKey or current user or may be no subscription
22+
if email
23+
p Управление подписками для #{email}.
24+
else
25+
p Ваш email:
2626

27+
input(type="email", name="email", placeholder="[email protected]", required, pattern=validate.patterns.email, style="font-size:125%")
2728

28-
form(method="POST", action="/newsletter/subscribe")
2929
input(type="hidden", name="_csrf", value=csrf())
3030
if accessKey
3131
input(type="hidden", name="accessKey", value=accessKey)
32-
else if subscription
33-
input(type="hidden", name="email", value=subscription.email)
32+
else if email
33+
input(type="hidden", name="email", value=email)
3434

3535
input(type="hidden", name="replace", value=1)
3636

0 commit comments

Comments
 (0)