diff --git a/sites/backend/src/landing/unsubscribe.html b/sites/backend/src/landing/unsubscribe.html
index 76a4aef7dc1..b7ed6ad1a97 100644
--- a/sites/backend/src/landing/unsubscribe.html
+++ b/sites/backend/src/landing/unsubscribe.html
@@ -37,7 +37,7 @@
-
+
Gone
You are no longer subscribed to the FreeSewing newsletter
diff --git a/sites/backend/src/middleware/express/bodyParser.js b/sites/backend/src/middleware/express/bodyParser.js
index 13ad583df26..8e242ebf56d 100644
--- a/sites/backend/src/middleware/express/bodyParser.js
+++ b/sites/backend/src/middleware/express/bodyParser.js
@@ -1,6 +1,6 @@
import bodyParser from 'body-parser'
-export default app => {
+export default (app) => {
app.use(bodyParser.json({ limit: '20mb' }))
app.use(bodyParser.urlencoded({ extended: true }))
}
diff --git a/sites/backend/src/middleware/express/cors.js b/sites/backend/src/middleware/express/cors.js
index c285a89523b..206b0970a24 100644
--- a/sites/backend/src/middleware/express/cors.js
+++ b/sites/backend/src/middleware/express/cors.js
@@ -1,5 +1,5 @@
import cors from 'cors'
-export default app => {
+export default (app) => {
app.use(cors())
}
diff --git a/sites/backend/src/middleware/passport/jwt.js b/sites/backend/src/middleware/passport/jwt.js
index 7488eebca43..85af45370f6 100644
--- a/sites/backend/src/middleware/passport/jwt.js
+++ b/sites/backend/src/middleware/passport/jwt.js
@@ -3,10 +3,10 @@ import config from '../../config'
const options = {
jwtFromRequest: jwt.ExtractJwt.fromAuthHeaderAsBearerToken(),
- ...config.jwt
+ ...config.jwt,
}
-export default passport => {
+export default (passport) => {
passport.use(
new jwt.Strategy(options, (jwt_payload, done) => {
return done(null, jwt_payload)
diff --git a/sites/backend/src/models/confirmation.js b/sites/backend/src/models/confirmation.js
index 508bc61097f..7be3d196519 100644
--- a/sites/backend/src/models/confirmation.js
+++ b/sites/backend/src/models/confirmation.js
@@ -6,14 +6,14 @@ import config from '../config'
const ConfirmationSchema = new Schema({
created: {
type: Date,
- default: Date.now
+ default: Date.now,
},
type: {
type: String,
enum: ['signup', 'emailchange', 'passwordreset', 'oauth', 'newsletter'],
- required: true
+ required: true,
},
- data: {}
+ data: {},
})
ConfirmationSchema.plugin(bcrypt)
@@ -21,7 +21,7 @@ ConfirmationSchema.plugin(bcrypt)
ConfirmationSchema.plugin(encrypt, {
secret: config.encryption.key,
encryptedFields: ['data'],
- decryptPostSave: false
+ decryptPostSave: false,
})
export default mongoose.model('Confirmation', ConfirmationSchema)
diff --git a/sites/backend/src/models/newsletter.js b/sites/backend/src/models/newsletter.js
index f08661ad93f..b8c08a1937e 100644
--- a/sites/backend/src/models/newsletter.js
+++ b/sites/backend/src/models/newsletter.js
@@ -6,19 +6,19 @@ import config from '../config'
const NewsletterSchema = new Schema({
created: {
type: Date,
- default: Date.now
+ default: Date.now,
},
email: {
type: String,
- required: true
+ required: true,
},
ehash: {
type: String,
required: true,
unique: true,
- index: true
+ index: true,
},
- data: {}
+ data: {},
})
NewsletterSchema.plugin(bcrypt)
@@ -28,7 +28,7 @@ NewsletterSchema.index({ ehash: 1 })
NewsletterSchema.plugin(encrypt, {
secret: config.encryption.key,
encryptedFields: ['email'],
- decryptPostSave: false
+ decryptPostSave: false,
})
export default mongoose.model('Newsletter', NewsletterSchema)
diff --git a/sites/backend/src/models/pattern.js b/sites/backend/src/models/pattern.js
index 72d7e613fd2..22c25377b79 100644
--- a/sites/backend/src/models/pattern.js
+++ b/sites/backend/src/models/pattern.js
@@ -8,51 +8,51 @@ const PatternSchema = new Schema(
lowercase: true,
unique: true,
trim: true,
- index: true
+ index: true,
},
user: {
type: String,
required: true,
lowercase: true,
trim: true,
- index: true
+ index: true,
},
person: {
type: String,
required: true,
lowercase: true,
trim: true,
- index: true
+ index: true,
},
name: {
type: String,
required: true,
- trim: true
+ trim: true,
},
created: Date,
notes: {
type: String,
- trim: true
+ trim: true,
},
- data: {}
+ data: {},
},
{ timestamps: true }
)
PatternSchema.index({ user: 1, handle: 1 })
-PatternSchema.methods.info = function() {
+PatternSchema.methods.info = function () {
return this.toObject()
}
-PatternSchema.methods.export = function() {
+PatternSchema.methods.export = function () {
let pattern = this.toObject()
for (let field of ['__v', '_id', '_v', 'created']) delete pattern[field]
return pattern
}
-PatternSchema.methods.anonymize = function() {
+PatternSchema.methods.anonymize = function () {
let pattern = this.toObject()
for (let field of ['__v', '_id', 'user', 'createdAt', 'updatedAt', '_v']) delete pattern[field]
diff --git a/sites/backend/src/models/person.js b/sites/backend/src/models/person.js
index 6bffe443e3a..b7732a72b48 100644
--- a/sites/backend/src/models/person.js
+++ b/sites/backend/src/models/person.js
@@ -13,37 +13,37 @@ const PersonSchema = new Schema(
lowercase: true,
unique: true,
trim: true,
- index: true
+ index: true,
},
user: {
type: String,
required: true,
lowercase: true,
trim: true,
- index: true
+ index: true,
},
name: {
type: String,
required: true,
- trim: true
+ trim: true,
},
breasts: {
type: Boolean,
- default: false
+ default: false,
},
picture: {
type: String,
trim: true,
- default: ''
+ default: '',
},
units: {
type: String,
enum: ['metric', 'imperial'],
- default: 'metric'
+ default: 'metric',
},
notes: {
type: String,
- trim: true
+ trim: true,
},
measurements: {
ankle: Number,
@@ -90,7 +90,7 @@ const PersonSchema = new Schema(
PersonSchema.index({ user: 1, handle: 1 })
-PersonSchema.methods.info = function() {
+PersonSchema.methods.info = function () {
let person = this.toObject()
delete person.__v
delete person._id
@@ -98,20 +98,20 @@ PersonSchema.methods.info = function() {
l: this.avatarUri(),
m: this.avatarUri('m'),
s: this.avatarUri('s'),
- xs: this.avatarUri('xs')
+ xs: this.avatarUri('xs'),
}
return person
}
-PersonSchema.methods.avatarName = function(size = 'l') {
+PersonSchema.methods.avatarName = function (size = 'l') {
let prefix = size === 'l' ? '' : size + '-'
if (this.picture.slice(-4).toLowerCase() === '.svg') prefix = ''
return prefix + this.picture
}
-PersonSchema.methods.avatarUri = function(size = 'l') {
+PersonSchema.methods.avatarUri = function (size = 'l') {
return (
config.static +
'/users/' +
@@ -125,7 +125,7 @@ PersonSchema.methods.avatarUri = function(size = 'l') {
)
}
-PersonSchema.methods.storagePath = function() {
+PersonSchema.methods.storagePath = function () {
return (
config.storage +
'/users/' +
@@ -138,24 +138,24 @@ PersonSchema.methods.storagePath = function() {
)
}
-PersonSchema.methods.createAvatar = function() {
+PersonSchema.methods.createAvatar = function () {
let dir = this.storagePath()
- fs.mkdir(dir, { recursive: true }, err => {
+ fs.mkdir(dir, { recursive: true }, (err) => {
if (err) console.log('mkdirFailed', dir, err)
- fs.writeFile(path.join(dir, this.handle) + '.svg', randomAvatar(), err => {
+ fs.writeFile(path.join(dir, this.handle) + '.svg', randomAvatar(), (err) => {
if (err) console.log('writeFileFailed', dir, err)
})
})
}
-PersonSchema.methods.saveAvatar = function(picture) {
+PersonSchema.methods.saveAvatar = function (picture) {
let type = picture.split(';').shift()
type = type.split('/').pop()
this.picture = this.handle + '.' + type
let dir = this.storagePath()
let b64 = picture.split(';base64,').pop()
- fs.mkdir(dir, { recursive: true }, err => {
+ fs.mkdir(dir, { recursive: true }, (err) => {
if (err) log.error('mkdirFailed', err)
let imgBuffer = Buffer.from(b64, 'base64')
for (let size of Object.keys(config.avatar.sizes)) {
diff --git a/sites/backend/src/models/user.js b/sites/backend/src/models/user.js
index 63c3278f989..d1c3e4eb551 100644
--- a/sites/backend/src/models/user.js
+++ b/sites/backend/src/models/user.js
@@ -12,24 +12,24 @@ const UserSchema = new Schema(
{
email: {
type: String,
- required: true
+ required: true,
},
ehash: {
type: String,
required: true,
unique: true,
- index: true
+ index: true,
},
initial: {
type: String,
- required: true
+ required: true,
},
username: {
type: String,
required: true,
unique: true,
index: true,
- trim: true
+ trim: true,
},
handle: {
type: String,
@@ -37,89 +37,89 @@ const UserSchema = new Schema(
lowercase: true,
trim: true,
index: true,
- unique: true
+ unique: true,
},
role: {
type: String,
enum: ['user', 'moderator', 'admin'],
required: true,
- default: 'user'
+ default: 'user',
},
patron: {
type: Number,
enum: [0, 2, 4, 8],
- default: 0
+ default: 0,
},
bio: {
type: String,
- default: ''
+ default: '',
},
picture: {
type: String,
trim: true,
- default: ''
+ default: '',
},
status: {
type: String,
enum: ['pending', 'active', 'blocked', 'frozen'],
default: 'pending',
- required: true
+ required: true,
},
password: {
type: String,
- bcrypt: true
+ bcrypt: true,
},
settings: {
language: {
type: String,
default: 'en',
- enum: config.languages
+ enum: config.languages,
},
units: {
type: String,
enum: ['metric', 'imperial'],
- default: 'metric'
- }
+ default: 'metric',
+ },
},
consent: {
profile: {
type: Boolean,
- default: false
+ default: false,
},
measurements: {
type: Boolean,
- default: false
+ default: false,
},
openData: {
type: Boolean,
- default: true
- }
+ default: true,
+ },
},
time: {
migrated: Date,
login: Date,
- patron: Date
+ patron: Date,
},
social: {
twitter: String,
instagram: String,
- github: String
+ github: String,
},
newsletter: {
type: Boolean,
- default: false
+ default: false,
},
},
{ timestamps: true }
)
-UserSchema.pre('remove', function(next) {
+UserSchema.pre('remove', function (next) {
email
.goodbye(this.email, this.settings.language)
.then(() => {
next()
})
- .catch(err => {
+ .catch((err) => {
logger.error(err)
next()
})
@@ -131,10 +131,10 @@ UserSchema.index({ ehash: 1, username: 1, handle: 1 })
UserSchema.plugin(encrypt, {
secret: config.encryption.key,
encryptedFields: ['email', 'initial', 'social.twitter', 'social.instagram', 'social.github'],
- decryptPostSave: true
+ decryptPostSave: true,
})
-UserSchema.methods.account = function() {
+UserSchema.methods.account = function () {
let account = this.toObject()
delete account.password
delete account.ehash
@@ -147,13 +147,13 @@ UserSchema.methods.account = function() {
l: this.avatarUri(),
m: this.avatarUri('m'),
s: this.avatarUri('s'),
- xs: this.avatarUri('xs')
+ xs: this.avatarUri('xs'),
}
return account
}
-UserSchema.methods.profile = function() {
+UserSchema.methods.profile = function () {
let account = this.toObject()
delete account.password
delete account.ehash
@@ -174,13 +174,13 @@ UserSchema.methods.profile = function() {
l: this.avatarUri(),
m: this.avatarUri('m'),
s: this.avatarUri('s'),
- xs: this.avatarUri('xs')
+ xs: this.avatarUri('xs'),
}
return account
}
-UserSchema.methods.adminProfile = function() {
+UserSchema.methods.adminProfile = function () {
let account = this.toObject()
delete account.password
delete account.ehash
@@ -194,13 +194,13 @@ UserSchema.methods.adminProfile = function() {
l: this.avatarUri(),
m: this.avatarUri('m'),
s: this.avatarUri('s'),
- xs: this.avatarUri('xs')
+ xs: this.avatarUri('xs'),
}
return account
}
-UserSchema.methods.export = function() {
+UserSchema.methods.export = function () {
let exported = this.toObject()
delete exported.password
delete exported.ehash
@@ -211,26 +211,26 @@ UserSchema.methods.export = function() {
return exported
}
-UserSchema.methods.updateLoginTime = function(callback) {
+UserSchema.methods.updateLoginTime = function (callback) {
this.set({ time: { login: new Date() } })
- this.save(function(err, user) {
+ this.save(function (err, user) {
return callback()
})
}
-UserSchema.methods.avatarName = function(size = 'l') {
+UserSchema.methods.avatarName = function (size = 'l') {
let prefix = size === 'l' ? '' : size + '-'
if (this.picture.slice(-4).toLowerCase() === '.svg') prefix = ''
return prefix + this.picture
}
-UserSchema.methods.storagePath = function() {
+UserSchema.methods.storagePath = function () {
return path.join(config.storage, 'users', this.handle.substring(0, 1), this.handle)
}
-UserSchema.methods.avatarUri = function(size = 'l') {
- if (!this.picture || this.picture.length < 5) return "https://freesewing.org/avatar.svg"
+UserSchema.methods.avatarUri = function (size = 'l') {
+ if (!this.picture || this.picture.length < 5) return 'https://freesewing.org/avatar.svg'
return (
config.static +
'/users/' +
@@ -242,14 +242,14 @@ UserSchema.methods.avatarUri = function(size = 'l') {
)
}
-UserSchema.methods.saveAvatar = function(picture) {
+UserSchema.methods.saveAvatar = function (picture) {
let type = picture.split(';').shift()
type = type.split('/').pop()
this.picture = this.handle + '.' + type
let dir = this.storagePath()
let b64 = picture.split(';base64,').pop()
- fs.mkdir(dir, { recursive: true }, err => {
+ fs.mkdir(dir, { recursive: true }, (err) => {
if (err) log.error('mkdirFailed', err)
let imgBuffer = Buffer.from(b64, 'base64')
for (let size of Object.keys(config.avatar.sizes)) {
@@ -262,11 +262,11 @@ UserSchema.methods.saveAvatar = function(picture) {
})
}
-UserSchema.methods.createAvatar = function() {
+UserSchema.methods.createAvatar = function () {
let dir = this.storagePath()
- fs.mkdirSync(dir, { recursive: true }, err => {
+ fs.mkdirSync(dir, { recursive: true }, (err) => {
if (err) console.log('mkdirFailed', dir, err)
- fs.writeFileSync(path.join(dir, this.handle) + '.svg', randomAvatar(), err => {
+ fs.writeFileSync(path.join(dir, this.handle) + '.svg', randomAvatar(), (err) => {
if (err) console.log('writeFileFailed', dir, err)
})
})
diff --git a/sites/backend/src/routes/admin.js b/sites/backend/src/routes/admin.js
index 6739041e003..87db357b78f 100644
--- a/sites/backend/src/routes/admin.js
+++ b/sites/backend/src/routes/admin.js
@@ -4,24 +4,20 @@ const Admin = new Controller()
export default (app, passport) => {
// Users
+ app.post('/admin/search', passport.authenticate('jwt', { session: false }), Admin.search)
+ app.put('/admin/patron', passport.authenticate('jwt', { session: false }), Admin.setPatronStatus)
+ app.put('/admin/role', passport.authenticate('jwt', { session: false }), Admin.setRole)
app.post(
- '/admin/search',
+ '/admin/impersonate',
passport.authenticate('jwt', { session: false }),
- Admin.search
+ Admin.impersonate
)
- app.put(
- '/admin/patron',
- passport.authenticate('jwt', { session: false }),
- Admin.setPatronStatus
- )
- app.put(
- '/admin/role',
- passport.authenticate('jwt', { session: false }),
- Admin.setRole
- )
- app.post('/admin/impersonate', passport.authenticate('jwt', { session: false }), Admin.impersonate)
app.put('/admin/unfreeze', passport.authenticate('jwt', { session: false }), Admin.unfreeze)
app.get('/admin/patrons', passport.authenticate('jwt', { session: false }), Admin.patronList)
- app.get('/admin/subscribers', passport.authenticate('jwt', { session: false }), Admin.subscriberList)
+ app.get(
+ '/admin/subscribers',
+ passport.authenticate('jwt', { session: false }),
+ Admin.subscriberList
+ )
app.get('/admin/stats', passport.authenticate('jwt', { session: false }), Admin.stats)
}
diff --git a/sites/backend/src/routes/index.js b/sites/backend/src/routes/index.js
index 950627b1fc9..80f8143b278 100644
--- a/sites/backend/src/routes/index.js
+++ b/sites/backend/src/routes/index.js
@@ -6,6 +6,6 @@ import github from './github'
import admin from './admin'
import newsletter from './newsletter'
import strapi from './strapi'
-import og from "./og";
+import og from './og'
export default { user, pattern, person, auth, github, admin, newsletter, strapi, og }
diff --git a/sites/backend/src/routes/newsletter.js b/sites/backend/src/routes/newsletter.js
index 5884b3409cb..52cf6e69cad 100644
--- a/sites/backend/src/routes/newsletter.js
+++ b/sites/backend/src/routes/newsletter.js
@@ -1,6 +1,6 @@
import Controller from '../controllers/newsletter'
-const Nws= new Controller()
+const Nws = new Controller()
export default (app, passport) => {
// Email subscribe
diff --git a/sites/backend/src/routes/og.js b/sites/backend/src/routes/og.js
index 8431f15e453..72f1b7d7413 100644
--- a/sites/backend/src/routes/og.js
+++ b/sites/backend/src/routes/og.js
@@ -1,11 +1,9 @@
-import Controller from "../controllers/og";
+import Controller from '../controllers/og'
// Note: Og = Open graph. See https://ogp.me/
-const Og = new Controller();
+const Og = new Controller()
export default (app, passport) => {
-
// Load open graph image (requires no authentication)
- app.get("/og-img/:lang/:site/*", Og.image);
-
+ app.get('/og-img/:lang/:site/*', Og.image)
}
diff --git a/sites/backend/src/routes/strapi.js b/sites/backend/src/routes/strapi.js
index 65a4767ec0c..a0a8049b9e0 100644
--- a/sites/backend/src/routes/strapi.js
+++ b/sites/backend/src/routes/strapi.js
@@ -1,6 +1,6 @@
import Controller from '../controllers/strapi'
-const Strapi= new Controller()
+const Strapi = new Controller()
export default (app, passport) => {
// Email subscribe
diff --git a/sites/backend/src/templates/emailchange.js b/sites/backend/src/templates/emailchange.js
index cf3456e36b3..afd2cb88d3a 100644
--- a/sites/backend/src/templates/emailchange.js
+++ b/sites/backend/src/templates/emailchange.js
@@ -4,7 +4,7 @@ const emailchange = {
'email.emailchangeCopy1',
'email.emailchangeActionText',
'email.questionsJustReply',
- 'email.signature'
+ 'email.signature',
],
html: `
@@ -71,7 +71,7 @@ __emailchangeCopy1__
__emailchangeActionLink__
-__questionsJustReply__`
+__questionsJustReply__`,
}
export default emailchange
diff --git a/sites/backend/src/templates/footer.js b/sites/backend/src/templates/footer.js
index 375f34694f4..8cb96af50e4 100644
--- a/sites/backend/src/templates/footer.js
+++ b/sites/backend/src/templates/footer.js
@@ -29,7 +29,7 @@ const footer = {