aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZephyrrus <[email protected]>2020-07-08 04:00:12 +0300
committerZephyrrus <[email protected]>2020-07-08 04:00:12 +0300
commitad852de51a0d2dd5d29c08838d5a430c58849e74 (patch)
treea4ab9a720f66271c9eba10916061a9b06c43656e /src
parentrefactor: refactor grid to use vuex for every action (diff)
downloadhost.fuwn.me-ad852de51a0d2dd5d29c08838d5a430c58849e74.tar.xz
host.fuwn.me-ad852de51a0d2dd5d29c08838d5a430c58849e74.zip
chore: linter the entire project using the new rules
Diffstat (limited to 'src')
-rw-r--r--src/api/database/migrations/20190221225812_initialMigration.js22
-rw-r--r--src/api/database/seeds/initial.js5
-rw-r--r--src/api/databaseMigration.js35
-rw-r--r--src/api/routes/admin/banIP.js2
-rw-r--r--src/api/routes/admin/fileGET.js2
-rw-r--r--src/api/routes/admin/unBanIP.js2
-rw-r--r--src/api/routes/admin/userDemote.js2
-rw-r--r--src/api/routes/admin/userDisable.js2
-rw-r--r--src/api/routes/admin/userEnable.js2
-rw-r--r--src/api/routes/admin/userGET.js2
-rw-r--r--src/api/routes/admin/userPromote.js2
-rw-r--r--src/api/routes/admin/userPurge.js2
-rw-r--r--src/api/routes/admin/usersGET.js2
-rw-r--r--src/api/routes/albums/albumDELETE.js1
-rw-r--r--src/api/routes/albums/albumPOST.js4
-rw-r--r--src/api/routes/albums/albumZipGET.js10
-rw-r--r--src/api/routes/albums/link/linkDELETE.js3
-rw-r--r--src/api/routes/albums/link/linkEditPOST.js3
-rw-r--r--src/api/routes/albums/link/linkPOST.js10
-rw-r--r--src/api/routes/albums/link/linksGET.js2
-rw-r--r--src/api/routes/auth/loginPOST.js8
-rw-r--r--src/api/routes/auth/registerPOST.js8
-rw-r--r--src/api/routes/files/filesAlbumsGET.js4
-rw-r--r--src/api/routes/files/filesGET.js2
-rw-r--r--src/api/routes/files/tagAddPOST.js5
-rw-r--r--src/api/routes/service/configGET.js10
-rw-r--r--src/api/routes/tags/tagPOST.js4
-rw-r--r--src/api/routes/tags/tagsGET.js3
-rw-r--r--src/api/routes/uploads/chunksPOST.js14
-rw-r--r--src/api/routes/uploads/uploadPOST.js44
-rw-r--r--src/api/routes/user/apiKey.js6
-rw-r--r--src/api/routes/user/changePasswordPOST.js6
-rw-r--r--src/api/routes/user/userGET.js4
-rw-r--r--src/api/routes/verifyGET.js4
-rw-r--r--src/api/structures/Route.js8
-rw-r--r--src/api/structures/Server.js1
-rw-r--r--src/api/utils/Log.js6
-rw-r--r--src/api/utils/ThumbUtil.js14
-rw-r--r--src/api/utils/Util.js4
-rw-r--r--src/api/utils/videoPreview/FragmentPreview.js7
-rw-r--r--src/api/utils/videoPreview/FrameIntervalPreview.js13
-rw-r--r--src/site/components/album/AlbumDetails.vue62
-rw-r--r--src/site/components/album/AlbumEntry.vue41
-rw-r--r--src/site/components/grid/Grid.vue4
-rw-r--r--src/site/components/loading/CubeShadow.vue17
-rw-r--r--src/site/components/loading/Origami.vue18
-rw-r--r--src/site/components/loading/PingPong.vue26
-rw-r--r--src/site/components/loading/RotateSquare.vue13
-rw-r--r--src/site/components/uploader/Uploader.vue1
-rw-r--r--src/site/layouts/default.vue23
-rw-r--r--src/site/layouts/error.vue2
-rw-r--r--src/site/middleware/admin.js3
-rw-r--r--src/site/middleware/auth.js3
-rw-r--r--src/site/pages/dashboard/admin/file/_id.vue82
-rw-r--r--src/site/pages/dashboard/admin/settings.vue85
-rw-r--r--src/site/pages/dashboard/tags/index.vue43
-rw-r--r--src/site/pages/faq.vue23
-rw-r--r--src/site/pages/index.vue1
-rw-r--r--src/site/pages/register.vue37
-rw-r--r--src/site/plugins/axios.js12
-rw-r--r--src/site/plugins/flexsearch.js5
-rw-r--r--src/site/plugins/nuxt-client-init.js2
-rw-r--r--src/site/plugins/vue-isyourpasswordsafe.js2
-rw-r--r--src/site/plugins/vue-timeago.js2
-rw-r--r--src/site/store/auth.js4
65 files changed, 460 insertions, 341 deletions
diff --git a/src/api/database/migrations/20190221225812_initialMigration.js b/src/api/database/migrations/20190221225812_initialMigration.js
index 4bcea8d..dd18ee5 100644
--- a/src/api/database/migrations/20190221225812_initialMigration.js
+++ b/src/api/database/migrations/20190221225812_initialMigration.js
@@ -1,5 +1,5 @@
-exports.up = async knex => {
- await knex.schema.createTable('users', table => {
+exports.up = async (knex) => {
+ await knex.schema.createTable('users', (table) => {
table.increments();
table.string('username');
table.text('password');
@@ -12,7 +12,7 @@ exports.up = async knex => {
table.timestamp('editedAt');
});
- await knex.schema.createTable('albums', table => {
+ await knex.schema.createTable('albums', (table) => {
table.increments();
table.integer('userId');
table.string('name');
@@ -22,7 +22,7 @@ exports.up = async knex => {
table.timestamp('editedAt');
});
- await knex.schema.createTable('files', table => {
+ await knex.schema.createTable('files', (table) => {
table.increments();
table.integer('userId');
table.string('name');
@@ -36,7 +36,7 @@ exports.up = async knex => {
table.timestamp('editedAt');
});
- await knex.schema.createTable('links', table => {
+ await knex.schema.createTable('links', (table) => {
table.increments();
table.integer('userId');
table.integer('albumId');
@@ -49,19 +49,19 @@ exports.up = async knex => {
table.timestamp('editedAt');
});
- await knex.schema.createTable('albumsFiles', table => {
+ await knex.schema.createTable('albumsFiles', (table) => {
table.increments();
table.integer('albumId');
table.integer('fileId');
});
- await knex.schema.createTable('albumsLinks', table => {
+ await knex.schema.createTable('albumsLinks', (table) => {
table.increments();
table.integer('albumId');
table.integer('linkId');
});
- await knex.schema.createTable('tags', table => {
+ await knex.schema.createTable('tags', (table) => {
table.increments();
table.string('uuid');
table.integer('userId');
@@ -70,19 +70,19 @@ exports.up = async knex => {
table.timestamp('editedAt');
});
- await knex.schema.createTable('fileTags', table => {
+ await knex.schema.createTable('fileTags', (table) => {
table.increments();
table.integer('fileId');
table.integer('tagId');
});
- await knex.schema.createTable('bans', table => {
+ await knex.schema.createTable('bans', (table) => {
table.increments();
table.string('ip');
table.timestamp('createdAt');
});
};
-exports.down = async knex => {
+exports.down = async (knex) => {
await knex.schema.dropTableIfExists('users');
await knex.schema.dropTableIfExists('albums');
await knex.schema.dropTableIfExists('files');
diff --git a/src/api/database/seeds/initial.js b/src/api/database/seeds/initial.js
index 280fd74..cdbfa80 100644
--- a/src/api/database/seeds/initial.js
+++ b/src/api/database/seeds/initial.js
@@ -1,7 +1,8 @@
+/* eslint-disable no-console */
const bcrypt = require('bcrypt');
const moment = require('moment');
-exports.seed = async db => {
+exports.seed = async (db) => {
const now = moment.utc().toDate();
const user = await db.table('users').where({ username: process.env.ADMIN_ACCOUNT }).first();
if (user) return;
@@ -14,7 +15,7 @@ exports.seed = async db => {
createdAt: now,
editedAt: now,
enabled: true,
- isAdmin: true
+ isAdmin: true,
});
console.log();
console.log('=========================================================');
diff --git a/src/api/databaseMigration.js b/src/api/databaseMigration.js
index 5cf4b39..d95605d 100644
--- a/src/api/databaseMigration.js
+++ b/src/api/databaseMigration.js
@@ -1,28 +1,31 @@
+/* eslint-disable eqeqeq */
+/* eslint-disable no-await-in-loop */
+/* eslint-disable no-console */
const nodePath = require('path');
const moment = require('moment');
const oldDb = require('knex')({
client: 'sqlite3',
connection: {
- filename: nodePath.join(__dirname, '..', '..', 'db')
+ filename: nodePath.join(__dirname, '..', '..', 'db'),
},
- useNullAsDefault: true
+ useNullAsDefault: true,
});
const newDb = require('knex')({
client: 'sqlite3',
connection: {
- filename: nodePath.join(__dirname, '..', '..', 'database.sqlite')
+ filename: nodePath.join(__dirname, '..', '..', 'database.sqlite'),
},
- postProcessResponse: result => {
+ postProcessResponse: (result) => {
const booleanFields = [
'enabled',
'enableDownload',
- 'isAdmin'
+ 'isAdmin',
];
- const processResponse = row => {
- Object.keys(row).forEach(key => {
+ const processResponse = (row) => {
+ Object.keys(row).forEach((key) => {
if (booleanFields.includes(key)) {
if (row[key] === 0) row[key] = false;
else if (row[key] === 1) row[key] = true;
@@ -31,11 +34,11 @@ const newDb = require('knex')({
return row;
};
- if (Array.isArray(result)) return result.map(row => processResponse(row));
+ if (Array.isArray(result)) return result.map((row) => processResponse(row));
if (typeof result === 'object') return processResponse(result);
return result;
},
- useNullAsDefault: true
+ useNullAsDefault: true,
});
const start = async () => {
@@ -49,13 +52,13 @@ const start = async () => {
id: user.id,
username: user.username,
password: user.password,
- enabled: user.enabled == 1 ? true : false,
+ enabled: user.enabled == 1,
isAdmin: false,
apiKey: user.token,
passwordEditedAt: now,
apiKeyEditedAt: now,
createdAt: now,
- editedAt: now
+ editedAt: now,
};
await newDb.table('users').insert(userToInsert);
}
@@ -71,7 +74,7 @@ const start = async () => {
name: album.name,
zippedAt: album.zipGeneratedAt ? moment.unix(album.zipGeneratedAt).toDate() : null,
createdAt: moment.unix(album.timestamp).toDate(),
- editedAt: moment.unix(album.editedAt).toDate()
+ editedAt: moment.unix(album.editedAt).toDate(),
};
const linkToInsert = {
userId: album.userid,
@@ -81,13 +84,13 @@ const start = async () => {
enabled: true,
enableDownload: true,
createdAt: now,
- editedAt: now
+ editedAt: now,
};
await newDb.table('albums').insert(albumToInsert);
const insertedId = await newDb.table('links').insert(linkToInsert);
await newDb.table('albumsLinks').insert({
albumId: album.id,
- linkId: insertedId[0]
+ linkId: insertedId[0],
});
}
console.log('Finished migrating albums...');
@@ -106,12 +109,12 @@ const start = async () => {
hash: file.hash,
ip: file.ip,
createdAt: moment.unix(file.timestamp).toDate(),
- editedAt: moment.unix(file.timestamp).toDate()
+ editedAt: moment.unix(file.timestamp).toDate(),
};
filesToInsert.push(fileToInsert);
albumsFilesToInsert.push({
albumId: file.albumid,
- fileId: file.id
+ fileId: file.id,
});
}
await newDb.batchInsert('files', filesToInsert, 20);
diff --git a/src/api/routes/admin/banIP.js b/src/api/routes/admin/banIP.js
index 692880d..4dfe03c 100644
--- a/src/api/routes/admin/banIP.js
+++ b/src/api/routes/admin/banIP.js
@@ -17,7 +17,7 @@ class banIP extends Route {
}
return res.json({
- message: 'Successfully banned the ip'
+ message: 'Successfully banned the ip',
});
}
}
diff --git a/src/api/routes/admin/fileGET.js b/src/api/routes/admin/fileGET.js
index 3bb8da4..0d1b147 100644
--- a/src/api/routes/admin/fileGET.js
+++ b/src/api/routes/admin/fileGET.js
@@ -21,7 +21,7 @@ class filesGET extends Route {
return res.json({
message: 'Successfully retrieved file',
file,
- user
+ user,
});
}
}
diff --git a/src/api/routes/admin/unBanIP.js b/src/api/routes/admin/unBanIP.js
index 493834b..725468c 100644
--- a/src/api/routes/admin/unBanIP.js
+++ b/src/api/routes/admin/unBanIP.js
@@ -19,7 +19,7 @@ class unBanIP extends Route {
}
return res.json({
- message: 'Successfully unbanned the ip'
+ message: 'Successfully unbanned the ip',
});
}
}
diff --git a/src/api/routes/admin/userDemote.js b/src/api/routes/admin/userDemote.js
index b430a48..3f6623d 100644
--- a/src/api/routes/admin/userDemote.js
+++ b/src/api/routes/admin/userDemote.js
@@ -20,7 +20,7 @@ class userDemote extends Route {
}
return res.json({
- message: 'Successfully demoted user'
+ message: 'Successfully demoted user',
});
}
}
diff --git a/src/api/routes/admin/userDisable.js b/src/api/routes/admin/userDisable.js
index e39c811..029e4af 100644
--- a/src/api/routes/admin/userDisable.js
+++ b/src/api/routes/admin/userDisable.js
@@ -20,7 +20,7 @@ class userDisable extends Route {
}
return res.json({
- message: 'Successfully disabled user'
+ message: 'Successfully disabled user',
});
}
}
diff --git a/src/api/routes/admin/userEnable.js b/src/api/routes/admin/userEnable.js
index cff622f..aca7a0b 100644
--- a/src/api/routes/admin/userEnable.js
+++ b/src/api/routes/admin/userEnable.js
@@ -20,7 +20,7 @@ class userEnable extends Route {
}
return res.json({
- message: 'Successfully enabled user'
+ message: 'Successfully enabled user',
});
}
}
diff --git a/src/api/routes/admin/userGET.js b/src/api/routes/admin/userGET.js
index 14a6c92..30c79f4 100644
--- a/src/api/routes/admin/userGET.js
+++ b/src/api/routes/admin/userGET.js
@@ -23,7 +23,7 @@ class usersGET extends Route {
return res.json({
message: 'Successfully retrieved user',
user,
- files
+ files,
});
} catch (error) {
return super.error(res, error);
diff --git a/src/api/routes/admin/userPromote.js b/src/api/routes/admin/userPromote.js
index 4a5ed88..3e14cb7 100644
--- a/src/api/routes/admin/userPromote.js
+++ b/src/api/routes/admin/userPromote.js
@@ -20,7 +20,7 @@ class userPromote extends Route {
}
return res.json({
- message: 'Successfully promoted user'
+ message: 'Successfully promoted user',
});
}
}
diff --git a/src/api/routes/admin/userPurge.js b/src/api/routes/admin/userPurge.js
index 90f6ec9..8f61ff9 100644
--- a/src/api/routes/admin/userPurge.js
+++ b/src/api/routes/admin/userPurge.js
@@ -18,7 +18,7 @@ class userDemote extends Route {
}
return res.json({
- message: 'Successfully deleted the user\'s files'
+ message: 'Successfully deleted the user\'s files',
});
}
}
diff --git a/src/api/routes/admin/usersGET.js b/src/api/routes/admin/usersGET.js
index 52a707f..4e9b954 100644
--- a/src/api/routes/admin/usersGET.js
+++ b/src/api/routes/admin/usersGET.js
@@ -12,7 +12,7 @@ class usersGET extends Route {
return res.json({
message: 'Successfully retrieved users',
- users
+ users,
});
} catch (error) {
return super.error(res, error);
diff --git a/src/api/routes/albums/albumDELETE.js b/src/api/routes/albums/albumDELETE.js
index 4e6640e..f9c22e6 100644
--- a/src/api/routes/albums/albumDELETE.js
+++ b/src/api/routes/albums/albumDELETE.js
@@ -1,5 +1,4 @@
const Route = require('../../structures/Route');
-const Util = require('../../utils/Util');
class albumDELETE extends Route {
constructor() {
diff --git a/src/api/routes/albums/albumPOST.js b/src/api/routes/albums/albumPOST.js
index 841da3d..94ee8a7 100644
--- a/src/api/routes/albums/albumPOST.js
+++ b/src/api/routes/albums/albumPOST.js
@@ -1,5 +1,5 @@
-const Route = require('../../structures/Route');
const moment = require('moment');
+const Route = require('../../structures/Route');
class albumPOST extends Route {
constructor() {
@@ -25,7 +25,7 @@ class albumPOST extends Route {
name,
userId: user.id,
createdAt: now,
- editedAt: now
+ editedAt: now,
};
const dbRes = await db.table('albums').insert(insertObj);
diff --git a/src/api/routes/albums/albumZipGET.js b/src/api/routes/albums/albumZipGET.js
index a6ef6fd..bd74ef3 100644
--- a/src/api/routes/albums/albumZipGET.js
+++ b/src/api/routes/albums/albumZipGET.js
@@ -1,8 +1,8 @@
+const path = require('path');
+const jetpack = require('fs-jetpack');
const Route = require('../../structures/Route');
const Util = require('../../utils/Util');
const log = require('../../utils/Log');
-const path = require('path');
-const jetpack = require('fs-jetpack');
class albumGET extends Route {
constructor() {
@@ -21,7 +21,7 @@ class albumGET extends Route {
.where({
identifier,
enabled: true,
- enableDownload: true
+ enableDownload: true,
})
.first();
if (!link) return res.status(400).json({ message: 'The supplied identifier could not be found' });
@@ -64,11 +64,11 @@ class albumGET extends Route {
/*
Get the actual files
*/
- const fileIds = fileList.map(el => el.fileId);
+ const fileIds = fileList.map((el) => el.fileId);
const files = await db.table('files')
.whereIn('id', fileIds)
.select('name');
- const filesToZip = files.map(el => el.name);
+ const filesToZip = files.map((el) => el.name);
try {
Util.createZip(filesToZip, album);
diff --git a/src/api/routes/albums/link/linkDELETE.js b/src/api/routes/albums/link/linkDELETE.js
index b02d0b4..0381b50 100644
--- a/src/api/routes/albums/link/linkDELETE.js
+++ b/src/api/routes/albums/link/linkDELETE.js
@@ -1,5 +1,4 @@
const Route = require('../../../structures/Route');
-const { dump } = require('dumper.js');
class linkDELETE extends Route {
constructor() {
@@ -28,7 +27,7 @@ class linkDELETE extends Route {
}
return res.json({
- message: 'Successfully deleted link'
+ message: 'Successfully deleted link',
});
}
}
diff --git a/src/api/routes/albums/link/linkEditPOST.js b/src/api/routes/albums/link/linkEditPOST.js
index 0c7233b..4e0e0e1 100644
--- a/src/api/routes/albums/link/linkEditPOST.js
+++ b/src/api/routes/albums/link/linkEditPOST.js
@@ -1,5 +1,4 @@
const Route = require('../../../structures/Route');
-const log = require('../../../utils/Log');
class linkEditPOST extends Route {
constructor() {
@@ -23,7 +22,7 @@ class linkEditPOST extends Route {
try {
const updateObj = {
enableDownload: enableDownload || false,
- expiresAt // This one should be null if not supplied
+ expiresAt, // This one should be null if not supplied
};
await db
.table('links')
diff --git a/src/api/routes/albums/link/linkPOST.js b/src/api/routes/albums/link/linkPOST.js
index 7ecc5cb..d58598a 100644
--- a/src/api/routes/albums/link/linkPOST.js
+++ b/src/api/routes/albums/link/linkPOST.js
@@ -28,15 +28,13 @@ class linkPOST extends Route {
.where('albumId', albumId)
.count({ count: 'id' })
.first();
- if (count >= parseInt(process.env.MAX_LINKS_PER_ALBUM, 10))
- return res.status(400).json({ message: 'Maximum links per album reached' });
+ if (count >= parseInt(process.env.MAX_LINKS_PER_ALBUM, 10)) return res.status(400).json({ message: 'Maximum links per album reached' });
/*
Try to allocate a new identifier on the db
*/
const identifier = await Util.getUniqueAlbumIdentifier();
- if (!identifier)
- return res.status(500).json({ message: 'There was a problem allocating a link for your album' });
+ if (!identifier) return res.status(500).json({ message: 'There was a problem allocating a link for your album' });
try {
const insertObj = {
@@ -46,13 +44,13 @@ class linkPOST extends Route {
enabled: true,
enableDownload: true,
expiresAt: null,
- views: 0
+ views: 0,
};
await db.table('links').insert(insertObj);
return res.json({
message: 'The link was created successfully',
- data: insertObj
+ data: insertObj,
});
} catch (error) {
return super.error(res, error);
diff --git a/src/api/routes/albums/link/linksGET.js b/src/api/routes/albums/link/linksGET.js
index edab49a..4487c26 100644
--- a/src/api/routes/albums/link/linksGET.js
+++ b/src/api/routes/albums/link/linksGET.js
@@ -14,7 +14,7 @@ class linkPOST extends Route {
return res.json({
message: 'Successfully retrieved links',
- links
+ links,
});
}
}
diff --git a/src/api/routes/auth/loginPOST.js b/src/api/routes/auth/loginPOST.js
index 205737a..5c7730c 100644
--- a/src/api/routes/auth/loginPOST.js
+++ b/src/api/routes/auth/loginPOST.js
@@ -1,7 +1,7 @@
-const Route = require('../../structures/Route');
const bcrypt = require('bcrypt');
const moment = require('moment');
const JWT = require('jsonwebtoken');
+const Route = require('../../structures/Route');
class loginPOST extends Route {
constructor() {
@@ -36,7 +36,7 @@ class loginPOST extends Route {
const jwt = JWT.sign({
iss: 'lolisafe',
sub: user.id,
- iat: moment.utc().valueOf()
+ iat: moment.utc().valueOf(),
}, process.env.SECRET, { expiresIn: '30d' });
return res.json({
@@ -45,10 +45,10 @@ class loginPOST extends Route {
id: user.id,
username: user.username,
apiKey: user.apiKey,
- isAdmin: user.isAdmin
+ isAdmin: user.isAdmin,
},
token: jwt,
- apiKey: user.apiKey
+ apiKey: user.apiKey,
});
}
}
diff --git a/src/api/routes/auth/registerPOST.js b/src/api/routes/auth/registerPOST.js
index feeb360..e2ac018 100644
--- a/src/api/routes/auth/registerPOST.js
+++ b/src/api/routes/auth/registerPOST.js
@@ -1,7 +1,7 @@
-const Route = require('../../structures/Route');
-const log = require('../../utils/Log');
const bcrypt = require('bcrypt');
const moment = require('moment');
+const Route = require('../../structures/Route');
+const log = require('../../utils/Log');
class registerPOST extends Route {
constructor() {
@@ -9,7 +9,7 @@ class registerPOST extends Route {
}
async run(req, res, db) {
- if (process.env.USER_ACCOUNTS == 'false') return res.status(401).json({ message: 'Creation of new accounts is currently disabled' });
+ if (process.env.USER_ACCOUNTS === 'false') return res.status(401).json({ message: 'Creation of new accounts is currently disabled' });
if (!req.body) return res.status(400).json({ message: 'No body provided' });
const { username, password } = req.body;
if (!username || !password) return res.status(401).json({ message: 'Invalid body provided' });
@@ -50,7 +50,7 @@ class registerPOST extends Route {
createdAt: now,
editedAt: now,
enabled: true,
- isAdmin: false
+ isAdmin: false,
});
return res.json({ message: 'The account was created successfully' });
}
diff --git a/src/api/routes/files/filesAlbumsGET.js b/src/api/routes/files/filesAlbumsGET.js
index 7f1190c..f5f2f3b 100644
--- a/src/api/routes/files/filesAlbumsGET.js
+++ b/src/api/routes/files/filesAlbumsGET.js
@@ -18,7 +18,7 @@ class filesGET extends Route {
.select('albumId');
if (albumFiles.length) {
- albumFiles = albumFiles.map(a => a.albumId);
+ albumFiles = albumFiles.map((a) => a.albumId);
albums = await db.table('albums')
.whereIn('id', albumFiles)
.select('id', 'name');
@@ -26,7 +26,7 @@ class filesGET extends Route {
return res.json({
message: 'Successfully retrieved file albums',
- albums
+ albums,
});
}
}
diff --git a/src/api/routes/files/filesGET.js b/src/api/routes/files/filesGET.js
index 9e90633..ce1d788 100644
--- a/src/api/routes/files/filesGET.js
+++ b/src/api/routes/files/filesGET.js
@@ -36,7 +36,7 @@ class filesGET extends Route {
return res.json({
message: 'Successfully retrieved files',
files,
- count
+ count,
});
}
}
diff --git a/src/api/routes/files/tagAddPOST.js b/src/api/routes/files/tagAddPOST.js
index 25467ab..07ecb18 100644
--- a/src/api/routes/files/tagAddPOST.js
+++ b/src/api/routes/files/tagAddPOST.js
@@ -14,7 +14,8 @@ class tagAddPOST extends Route {
const file = await db.table('files').where({ id: fileId, userId: user.id }).first();
if (!file) return res.status(400).json({ message: 'File doesn\'t exist.' });
- tagNames.forEach(async tag => {
+ // eslint-disable-next-line consistent-return
+ tagNames.forEach(async (tag) => {
try {
await db.table('fileTags').insert({ fileId, tag });
} catch (error) {
@@ -23,7 +24,7 @@ class tagAddPOST extends Route {
});
return res.json({
- message: 'Successfully added file to album'
+ message: 'Successfully added file to album',
});
}
}
diff --git a/src/api/routes/service/configGET.js b/src/api/routes/service/configGET.js
index b653066..3c6a2f8 100644
--- a/src/api/routes/service/configGET.js
+++ b/src/api/routes/service/configGET.js
@@ -15,11 +15,11 @@ class configGET extends Route {
maxUploadSize: parseInt(process.env.MAX_SIZE, 10),
filenameLength: parseInt(process.env.GENERATED_FILENAME_LENGTH, 10),
albumLinkLength: parseInt(process.env.GENERATED_ALBUM_LENGTH, 10),
- generateThumbnails: process.env.GENERATE_THUMBNAILS == 'true' ? true : false,
- generateZips: process.env.GENERATE_ZIPS == 'true' ? true : false,
- publicMode: process.env.PUBLIC_MODE == 'true' ? true : false,
- enableAccounts: process.env.USER_ACCOUNTS == 'true' ? true : false
- }
+ generateThumbnails: process.env.GENERATE_THUMBNAILS === 'true',
+ generateZips: process.env.GENERATE_ZIPS === 'true',
+ publicMode: process.env.PUBLIC_MODE === 'true',
+ enableAccounts: process.env.USER_ACCOUNTS === 'true',
+ },
});
}
}
diff --git a/src/api/routes/tags/tagPOST.js b/src/api/routes/tags/tagPOST.js
index b6ec395..856e0d4 100644
--- a/src/api/routes/tags/tagPOST.js
+++ b/src/api/routes/tags/tagPOST.js
@@ -1,5 +1,5 @@
-const Route = require('../../structures/Route');
const moment = require('moment');
+const Route = require('../../structures/Route');
class tagPOST extends Route {
constructor() {
@@ -22,7 +22,7 @@ class tagPOST extends Route {
name,
userId: user.id,
createdAt: now,
- editedAt: now
+ editedAt: now,
});
return res.json({ message: 'The tag was created successfully' });
diff --git a/src/api/routes/tags/tagsGET.js b/src/api/routes/tags/tagsGET.js
index 871148e..848e08d 100644
--- a/src/api/routes/tags/tagsGET.js
+++ b/src/api/routes/tags/tagsGET.js
@@ -1,5 +1,4 @@
const Route = require('../../structures/Route');
-const Util = require('../../utils/Util');
class tagsGET extends Route {
constructor() {
@@ -20,7 +19,7 @@ class tagsGET extends Route {
return res.json({
message: 'Successfully retrieved tags',
- tags
+ tags,
});
} catch (error) {
return super.error(res, error);
diff --git a/src/api/routes/uploads/chunksPOST.js b/src/api/routes/uploads/chunksPOST.js
index 013c0d6..a9baf55 100644
--- a/src/api/routes/uploads/chunksPOST.js
+++ b/src/api/routes/uploads/chunksPOST.js
@@ -1,27 +1,27 @@
-const Route = require('../../structures/Route');
const path = require('path');
-const Util = require('../../utils/Util');
const jetpack = require('fs-jetpack');
const randomstring = require('randomstring');
+const Util = require('../../utils/Util');
+const Route = require('../../structures/Route');
class uploadPOST extends Route {
constructor() {
super('/upload/chunks', 'post', {
bypassAuth: true,
- canApiKey: true
+ canApiKey: true,
});
}
- async run(req, res, db) {
+ async run(req, res) {
const filename = Util.getUniqueFilename(randomstring.generate(32));
// console.log('Files', req.body.files);
const info = {
size: req.body.files[0].size,
- url: `${process.env.DOMAIN}/`
+ url: `${process.env.DOMAIN}/`,
};
for (const chunk of req.body.files) {
- const { uuid, count } = chunk;
+ const { uuid } = chunk;
// console.log('Chunk', chunk);
const chunkOutput = path.join(__dirname,
@@ -65,7 +65,7 @@ class uploadPOST extends Route {
return res.status(201).send({
message: 'Sucessfully merged the chunk(s).',
- ...info
+ ...info,
/*
name: `${filename}${ext || ''}`,
size: exists.size,
diff --git a/src/api/routes/uploads/uploadPOST.js b/src/api/routes/uploads/uploadPOST.js
index 6c01dd3..48fc592 100644
--- a/src/api/routes/uploads/uploadPOST.js
+++ b/src/api/routes/uploads/uploadPOST.js
@@ -1,17 +1,18 @@
-const Route = require('../../structures/Route');
const path = require('path');
-const Util = require('../../utils/Util');
const jetpack = require('fs-jetpack');
const multer = require('multer');
const moment = require('moment');
+const Util = require('../../utils/Util');
+const Route = require('../../structures/Route');
+
const upload = multer({
storage: multer.memoryStorage(),
limits: {
fileSize: parseInt(process.env.MAX_SIZE, 10) * (1000 * 1000),
- files: 1
+ files: 1,
},
- fileFilter: (req, file, cb) => {
- // TODO: Enable blacklisting of files/extensions
+ fileFilter: (req, file, cb) =>
+ // TODO: Enable blacklisting of files/extensions
/*
if (options.blacklist.mimes.includes(file.mimetype)) {
return cb(new Error(`${file.mimetype} is a blacklisted filetype.`));
@@ -19,35 +20,34 @@ const upload = multer({
return cb(new Error(`${path.extname(file.originalname).toLowerCase()} is a blacklisted extension.`));
}
*/
- return cb(null, true);
- }
+ cb(null, true)
+ ,
}).array('files[]');
/*
TODO: If source has transparency generate a png thumbnail, otherwise a jpg.
TODO: If source is a gif, generate a thumb of the first frame and play the gif on hover on the frontend.
- TODO: If source is a video, generate a thumb of the first frame and save the video length to the file?
- Another possible solution would be to play a gif on hover that grabs a few chunks like youtube.
TODO: Think if its worth making a folder with the user uuid in uploads/ and upload the pictures there so
that this way at least not every single file will be in 1 directory
- - Addendum to this: Now that the default behaviour is to serve files with node, we can actually pull this off. Before this, having files in
- subfolders meant messing with nginx and the paths, but now it should be fairly easy to re-arrange the folder structure with express.static
- I see great value in this, open to suggestions.
+ XXX: Now that the default behaviour is to serve files with node, we can actually pull this off.
+ Before this, having files in subfolders meant messing with nginx and the paths,
+ but now it should be fairly easy to re-arrange the folder structure with express.static
+ I see great value in this, open to suggestions.
*/
class uploadPOST extends Route {
constructor() {
super('/upload', 'post', {
bypassAuth: true,
- canApiKey: true
+ canApiKey: true,
});
}
async run(req, res, db) {
const user = await Util.isAuthorized(req);
- if (!user && process.env.PUBLIC_MODE == 'false') return res.status(401).json({ message: 'Not authorized to use this resource' });
+ if (!user && process.env.PUBLIC_MODE === 'false') return res.status(401).json({ message: 'Not authorized to use this resource' });
const albumId = req.body.albumid || req.headers.albumid;
if (albumId && !user) return res.status(401).json({ message: 'Only registered users can upload files to an album' });
@@ -56,12 +56,13 @@ class uploadPOST extends Route {
if (!album) return res.status(401).json({ message: 'Album doesn\'t exist or it doesn\'t belong to the user' });
}
- return upload(req, res, async err => {
+ return upload(req, res, async (err) => {
if (err) console.error(err.message);
let uploadedFile = {};
let insertedId;
+ // eslint-disable-next-line no-underscore-dangle
const remappedKeys = this._remapKeys(req.body);
const file = req.files[0];
@@ -105,7 +106,7 @@ class uploadPOST extends Route {
name: filename,
hash,
size: file.buffer.length,
- url: filename
+ url: filename,
};
}
@@ -124,7 +125,7 @@ class uploadPOST extends Route {
return res.status(201).send({
message: 'Sucessfully uploaded the file.',
- ...uploadedFile
+ ...uploadedFile,
});
});
}
@@ -137,7 +138,7 @@ class uploadPOST extends Route {
size: exists.size,
url: `${process.env.DOMAIN}/${exists.name}`,
deleteUrl: `${process.env.DOMAIN}/api/file/${exists.id}`,
- repeated: true
+ repeated: true,
});
return Util.deleteFile(filename);
@@ -145,7 +146,7 @@ class uploadPOST extends Route {
async checkIfFileExists(db, user, hash) {
const exists = await db.table('files')
- .where(function() { // eslint-disable-line func-names
+ .where(function () { // eslint-disable-line func-names
if (user) this.where('userId', user.id);
else this.whereNull('userId');
})
@@ -186,7 +187,7 @@ class uploadPOST extends Route {
hash: file.hash,
ip: req.ip,
createdAt: now,
- editedAt: now
+ editedAt: now,
});
} else {
insertedId = await db.table('files').insert({
@@ -198,7 +199,7 @@ class uploadPOST extends Route {
hash: file.hash,
ip: req.ip,
createdAt: now,
- editedAt: now
+ editedAt: now,
}, 'id');
}
return insertedId;
@@ -220,6 +221,7 @@ class uploadPOST extends Route {
}
return body;
}
+ return keys;
}
}
diff --git a/src/api/routes/user/apiKey.js b/src/api/routes/user/apiKey.js
index a87d98d..a63f0c0 100644
--- a/src/api/routes/user/apiKey.js
+++ b/src/api/routes/user/apiKey.js
@@ -1,7 +1,7 @@
-const Route = require('../../structures/Route');
const randomstring = require('randomstring');
const moment = require('moment');
const { dump } = require('dumper.js');
+const Route = require('../../structures/Route');
class apiKeyPOST extends Route {
constructor() {
@@ -17,7 +17,7 @@ class apiKeyPOST extends Route {
.where({ id: user.id })
.update({
apiKey,
- apiKeyEditedAt: now
+ apiKeyEditedAt: now,
});
} catch (error) {
dump(error);
@@ -26,7 +26,7 @@ class apiKeyPOST extends Route {
return res.json({
message: 'Successfully created new api key',
- apiKey
+ apiKey,
});
}
}
diff --git a/src/api/routes/user/changePasswordPOST.js b/src/api/routes/user/changePasswordPOST.js
index 9cd621e..1b3a27a 100644
--- a/src/api/routes/user/changePasswordPOST.js
+++ b/src/api/routes/user/changePasswordPOST.js
@@ -1,7 +1,7 @@
-const Route = require('../../structures/Route');
-const log = require('../../utils/Log');
const bcrypt = require('bcrypt');
const moment = require('moment');
+const Route = require('../../structures/Route');
+const log = require('../../utils/Log');
class changePasswordPOST extends Route {
constructor() {
@@ -36,7 +36,7 @@ class changePasswordPOST extends Route {
const now = moment.utc().toDate();
await db.table('users').where('id', user.id).update({
password: hash,
- passwordEditedAt: now
+ passwordEditedAt: now,
});
return res.json({ message: 'The password was changed successfully' });
diff --git a/src/api/routes/user/userGET.js b/src/api/routes/user/userGET.js
index 7929aac..6f179a9 100644
--- a/src/api/routes/user/userGET.js
+++ b/src/api/routes/user/userGET.js
@@ -12,8 +12,8 @@ class usersGET extends Route {
id: user.id,
username: user.username,
isAdmin: user.isAdmin,
- apiKey: user.apiKey
- }
+ apiKey: user.apiKey,
+ },
});
}
}
diff --git a/src/api/routes/verifyGET.js b/src/api/routes/verifyGET.js
index 2f370e8..107c20a 100644
--- a/src/api/routes/verifyGET.js
+++ b/src/api/routes/verifyGET.js
@@ -11,8 +11,8 @@ class verifyGET extends Route {
user: {
id: user.id,
username: user.username,
- isAdmin: user.isAdmin
- }
+ isAdmin: user.isAdmin,
+ },
});
}
}
diff --git a/src/api/structures/Route.js b/src/api/structures/Route.js
index c2ad32e..400ae3d 100644
--- a/src/api/structures/Route.js
+++ b/src/api/structures/Route.js
@@ -55,7 +55,8 @@ class Route {
if (banned) return res.status(401).json({ message: 'This IP has been banned from using the service.' });
if (this.options.bypassAuth) return this.run(req, res, db);
- // The only reason I call it token here and not Api Key is to be backwards compatible with the uploader and sharex
+ // The only reason I call it token here and not Api Key is to be backwards compatible
+ // with the uploader and sharex
// Small price to pay.
if (req.headers.token) return this.authorizeApiKey(req, res, req.headers.token);
if (!req.headers.authorization) return res.status(401).json({ message: 'No authorization header provided' });
@@ -96,10 +97,7 @@ class Route {
return this.run(req, res, db, user);
}
- run(req, res, db) {
- // eslint-disable-line no-unused-vars
-
- }
+ run() {}
error(res, error) {
log.error(error);
diff --git a/src/api/structures/Server.js b/src/api/structures/Server.js
index 5d2290b..c8537fb 100644
--- a/src/api/structures/Server.js
+++ b/src/api/structures/Server.js
@@ -11,6 +11,7 @@ const morgan = require('morgan');
const log = require('../utils/Log');
const ThumbUtil = require('../utils/ThumbUtil');
+// eslint-disable-next-line no-unused-vars
const rateLimiter = new RateLimit({
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW, 10),
max: parseInt(process.env.RATE_LIMIT_MAX, 10),
diff --git a/src/api/utils/Log.js b/src/api/utils/Log.js
index 8b38c2b..99d11e4 100644
--- a/src/api/utils/Log.js
+++ b/src/api/utils/Log.js
@@ -27,12 +27,6 @@ class Log {
else console.log(chalk.gray(args)); // eslint-disable-line no-console
}
- /*
- static dump(args) {
- dump(args);
- }
- */
-
static checkIfArrayOrObject(thing) {
if (typeof thing === typeof [] || typeof thing === typeof {}) return true;
return false;
diff --git a/src/api/utils/ThumbUtil.js b/src/api/utils/ThumbUtil.js
index f8c73e7..98ba5c0 100644
--- a/src/api/utils/ThumbUtil.js
+++ b/src/api/utils/ThumbUtil.js
@@ -22,7 +22,9 @@ class ThumbUtil {
const output = `${filename.slice(0, -ext.length)}.png`;
const previewOutput = `${filename.slice(0, -ext.length)}.webm`;
+ // eslint-disable-next-line max-len
if (ThumbUtil.imageExtensions.includes(ext)) return ThumbUtil.generateThumbnailForImage(filename, output);
+ // eslint-disable-next-line max-len
if (ThumbUtil.videoExtensions.includes(ext)) return ThumbUtil.generateThumbnailForVideo(filename, previewOutput);
return null;
}
@@ -75,17 +77,21 @@ class ThumbUtil {
}
static getFileThumbnail(filename) {
- // TODO: refactor so we don't do the same compare multiple times (poor cpu cycles)
if (!filename) return null;
const ext = path.extname(filename).toLowerCase();
- if (!ThumbUtil.imageExtensions.includes(ext) && !ThumbUtil.videoExtensions.includes(ext)) return null;
- if (ThumbUtil.imageExtensions.includes(ext)) return { thumb: `${filename.slice(0, -ext.length)}.png` };
- if (ThumbUtil.videoExtensions.includes(ext)) {
+
+ const isImage = ThumbUtil.imageExtensions.includes(ext);
+ const isVideo = ThumbUtil.videoExtensions.includes(ext);
+
+ if (isImage) return { thumb: `${filename.slice(0, -ext.length)}.png` };
+ if (isVideo) {
return {
thumb: `${filename.slice(0, -ext.length)}.png`,
preview: `${filename.slice(0, -ext.length)}.webm`,
};
}
+
+ return null;
}
static async removeThumbs({ thumb, preview }) {
diff --git a/src/api/utils/Util.js b/src/api/utils/Util.js
index ab59c95..905948a 100644
--- a/src/api/utils/Util.js
+++ b/src/api/utils/Util.js
@@ -52,7 +52,7 @@ class Util {
static getUniqueFilename(name) {
const retry = (i = 0) => {
- const filename = randomstring.generate({
+ const filename = randomstring.generate({
length: parseInt(process.env.GENERATED_FILENAME_LENGTH, 10),
capitalization: 'lowercase',
}) + path.extname(name).toLowerCase();
@@ -81,7 +81,7 @@ class Util {
/*
It's funny but if you do i++ the asignment never gets done resulting in an infinite loop
*/
- if (i < 5) return retry(++i);
+ if (i < 5) return retry(i + 1);
log.error('Couldnt allocate identifier for album');
return null;
};
diff --git a/src/api/utils/videoPreview/FragmentPreview.js b/src/api/utils/videoPreview/FragmentPreview.js
index 8815392..bf623c1 100644
--- a/src/api/utils/videoPreview/FragmentPreview.js
+++ b/src/api/utils/videoPreview/FragmentPreview.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-bitwise */
const ffmpeg = require('fluent-ffmpeg');
const probe = require('ffmpeg-probe');
@@ -24,7 +25,7 @@ const getStartTime = (vDuration, fDuration, ignoreBeforePercent, ignoreAfterPerc
return getRandomInt(ignoreBeforePercent * safeVDuration, ignoreAfterPercent * safeVDuration);
};
-module.exports = async opts => {
+module.exports = async (opts) => {
const {
log = noop,
@@ -37,7 +38,7 @@ module.exports = async opts => {
fragmentDurationSecond = 3,
ignoreBeforePercent = 0.25,
- ignoreAfterPercent = 0.75
+ ignoreAfterPercent = 0.75,
} = opts;
const info = await probe(input);
@@ -77,7 +78,7 @@ module.exports = async opts => {
.outputOptions([`-t ${fragmentDurationSecond}`])
.noAudio()
.output(output)
- .on('start', cmd => log && log({ cmd }))
+ .on('start', (cmd) => log && log({ cmd }))
.on('end', resolve)
.on('error', reject)
.run();
diff --git a/src/api/utils/videoPreview/FrameIntervalPreview.js b/src/api/utils/videoPreview/FrameIntervalPreview.js
index 75f6d2b..8c5f1c3 100644
--- a/src/api/utils/videoPreview/FrameIntervalPreview.js
+++ b/src/api/utils/videoPreview/FrameIntervalPreview.js
@@ -1,9 +1,10 @@
+/* eslint-disable no-bitwise */
const ffmpeg = require('fluent-ffmpeg');
const probe = require('ffmpeg-probe');
const noop = () => {};
-module.exports = async opts => {
+module.exports = async (opts) => {
const {
log = noop,
@@ -15,13 +16,13 @@ module.exports = async opts => {
output,
numFrames,
- numFramesPercent = 0.05
+ numFramesPercent = 0.05,
} = opts;
const info = await probe(input);
// const numFramesTotal = parseInt(info.streams[0].nb_frames, 10);
const { avg_frame_rate: avgFrameRate, duration } = info.streams[0];
- const [frames, time] = avgFrameRate.split('/').map(e => parseInt(e, 10));
+ const [frames, time] = avgFrameRate.split('/').map((e) => parseInt(e, 10));
const numFramesTotal = (frames / time) * duration;
@@ -31,7 +32,7 @@ module.exports = async opts => {
const result = {
output,
- numFrames: numFramesToCapture
+ numFrames: numFramesToCapture,
};
await new Promise((resolve, reject) => {
@@ -62,9 +63,9 @@ module.exports = async opts => {
.noAudio()
.outputFormat('webm')
.output(output)
- .on('start', cmd => log && log({ cmd }))
+ .on('start', (cmd) => log && log({ cmd }))
.on('end', () => resolve())
- .on('error', err => reject(err))
+ .on('error', (err) => reject(err))
.run();
});
diff --git a/src/site/components/album/AlbumDetails.vue b/src/site/components/album/AlbumDetails.vue
index f117f2f..b411f13 100644
--- a/src/site/components/album/AlbumDetails.vue
+++ b/src/site/components/album/AlbumDetails.vue
@@ -6,34 +6,43 @@
:data="details.links || []"
:mobile-cards="true">
<template slot-scope="props">
- <b-table-column field="identifier"
+ <b-table-column
+ field="identifier"
label="Link"
centered>
- <a :href="`${config.URL}/a/${props.row.identifier}`"
+ <a
+ :href="`${config.URL}/a/${props.row.identifier}`"
target="_blank">
{{ props.row.identifier }}
</a>
</b-table-column>
- <b-table-column field="views"
+ <b-table-column
+ field="views"
label="Views"
centered>
{{ props.row.views }}
</b-table-column>
- <b-table-column field="enableDownload"
+ <b-table-column
+ field="enableDownload"
label="Allow download"
centered>
- <b-switch v-model="props.row.enableDownload"
+ <b-switch
+ v-model="props.row.enableDownload"
@input="updateLinkOptions(albumId, props.row)" />
</b-table-column>
- <b-table-column field="enabled"
+ <b-table-column
+ field="enabled"
numeric>
- <button :class="{ 'is-loading': isDeleting(props.row.identifier) }"
+ <button
+ :class="{ 'is-loading': isDeleting(props.row.identifier) }"
class="button is-danger"
:disabled="isDeleting(props.row.identifier)"
- @click="promptDeleteAlbumLink(albumId, props.row.identifier)">Delete link</button>
+ @click="promptDeleteAlbumLink(albumId, props.row.identifier)">
+ Delete link
+ </button>
</b-table-column>
</template>
<template slot="empty">
@@ -49,10 +58,13 @@
<div class="level is-paddingless">
<div class="level-left">
<div class="level-item">
- <button :class="{ 'is-loading': isCreatingLink }"
+ <button
+ :class="{ 'is-loading': isCreatingLink }"
class="button is-primary"
style="float: left"
- @click="createLink(albumId)">Create new link</button>
+ @click="createLink(albumId)">
+ Create new link
+ </button>
</div>
<div class="level-item">
<span class="has-text-default">{{ details.links.length }} / {{ config.maxLinksPerAlbum }} links created</span>
@@ -61,9 +73,12 @@
<div class="level-right">
<div class="level-item">
- <button class="button is-danger"
+ <button
+ class="button is-danger"
style="float: right"
- @click="promptDeleteAlbum(albumId)">Delete album</button>
+ @click="promptDeleteAlbum(albumId)">
+ Delete album
+ </button>
</div>
</div>
</div>
@@ -79,18 +94,18 @@ export default {
props: {
albumId: {
type: Number,
- default: 0
+ default: 0,
},
details: {
type: Object,
- default: () => ({})
+ default: () => ({}),
},
},
data() {
return {
isCreatingLink: false,
isDeletingLinks: [],
- }
+ };
},
computed: mapState(['config']),
methods: {
@@ -99,20 +114,20 @@ export default {
deleteAlbumLinkAction: 'albums/deleteLink',
updateLinkOptionsAction: 'albums/updateLinkOptions',
createLinkAction: 'albums/createLink',
- alert: 'alert/set'
+ alert: 'alert/set',
}),
promptDeleteAlbum(id) {
this.$buefy.dialog.confirm({
type: 'is-danger',
message: 'Are you sure you want to delete this album?',
- onConfirm: () => this.deleteAlbum(id)
+ onConfirm: () => this.deleteAlbum(id),
});
},
promptDeleteAlbumLink(albumId, identifier) {
this.$buefy.dialog.confirm({
type: 'is-danger',
message: 'Are you sure you want to delete this album link?',
- onConfirm: () => this.deleteAlbumLink(albumId, identifier)
+ onConfirm: () => this.deleteAlbumLink(albumId, identifier),
});
},
async deleteAlbum(id) {
@@ -122,7 +137,7 @@ export default {
this.alert({ text: response.message, error: false });
} catch (e) {
this.alert({ text: e.message, error: true });
- }
+ }
},
async deleteAlbumLink(albumId, identifier) {
this.isDeletingLinks.push(identifier);
@@ -133,7 +148,7 @@ export default {
} catch (e) {
this.alert({ text: e.message, error: true });
} finally {
- this.isDeletingLinks = this.isDeletingLinks.filter(e => e !== identifier);
+ this.isDeletingLinks = this.isDeletingLinks.filter((e) => e !== identifier);
}
},
async createLink(albumId) {
@@ -155,12 +170,12 @@ export default {
this.alert({ text: response.message, error: false });
} catch (e) {
this.alert({ text: e.message, error: true });
- }
+ }
},
isDeleting(identifier) {
return this.isDeletingLinks.indexOf(identifier) > -1;
- }
- }
+ },
+ },
};
</script>
@@ -184,7 +199,6 @@ export default {
}
</style>
-
<style lang="scss">
@import '~/assets/styles/_colors.scss';
diff --git a/src/site/components/album/AlbumEntry.vue b/src/site/components/album/AlbumEntry.vue
index 28e434a..2723b49 100644
--- a/src/site/components/album/AlbumEntry.vue
+++ b/src/site/components/album/AlbumEntry.vue
@@ -1,8 +1,10 @@
<template>
<div class="album">
- <div class="arrow-container"
+ <div
+ class="arrow-container"
@click="toggleDetails(album)">
- <i :class="{ active: isExpanded }"
+ <i
+ :class="{ active: isExpanded }"
class="icon-arrow" />
</div>
<div class="thumb">
@@ -12,7 +14,9 @@
</div>
<div class="info">
<h4>
- <router-link :to="`/dashboard/albums/${album.id}`">{{ album.name }}</router-link>
+ <router-link :to="`/dashboard/albums/${album.id}`">
+ {{ album.name }}
+ </router-link>
</h4>
<span>
Created <span class="is-inline has-text-weight-semibold"><timeago :since="album.createdAt" /></span>
@@ -21,19 +25,24 @@
</div>
<div class="latest is-hidden-mobile">
<template v-if="album.fileCount > 0">
- <div v-for="file of album.files"
+ <div
+ v-for="file of album.files"
:key="file.id"
class="thumb">
<figure class="image is-64x64">
- <a :href="file.url"
+ <a
+ :href="file.url"
target="_blank">
<img :src="file.thumbSquare">
</a>
</figure>
</div>
- <div v-if="album.fileCount > 5"
+ <div
+ v-if="album.fileCount > 5"
class="thumb more no-background">
- <router-link :to="`/dashboard/albums/${album.id}`">{{ album.fileCount - 5 }}+ more</router-link>
+ <router-link :to="`/dashboard/albums/${album.id}`">
+ {{ album.fileCount - 5 }}+ more
+ </router-link>
</div>
</template>
<template v-else>
@@ -41,7 +50,8 @@
</template>
</div>
- <AlbumDetails v-if="isExpanded"
+ <AlbumDetails
+ v-if="isExpanded"
:details="getDetails(album.id)"
:albumId="album.id" />
</div>
@@ -53,22 +63,22 @@ import AlbumDetails from '~/components/album/AlbumDetails.vue';
export default {
components: {
- AlbumDetails
+ AlbumDetails,
},
props: {
album: {
type: Object,
- default: () => ({})
- }
+ default: () => ({}),
+ },
},
computed: {
...mapGetters({
isExpandedGetter: 'albums/isExpanded',
- getDetails: 'albums/getDetails'
+ getDetails: 'albums/getDetails',
}),
isExpanded() {
return this.isExpandedGetter(this.album.id);
- }
+ },
},
methods: {
async toggleDetails(album) {
@@ -76,8 +86,8 @@ export default {
await this.$store.dispatch('albums/fetchDetails', album.id);
}
this.$store.commit('albums/toggleExpandedState', album.id);
- }
- }
+ },
+ },
};
</script>
@@ -175,4 +185,3 @@ export default {
div.no-background { background: none !important; }
</style>
-
diff --git a/src/site/components/grid/Grid.vue b/src/site/components/grid/Grid.vue
index 42dcc6b..84c0b11 100644
--- a/src/site/components/grid/Grid.vue
+++ b/src/site/components/grid/Grid.vue
@@ -163,7 +163,7 @@
<hr>
<div class="albums-container">
- <div v-for="(album, index) in albums" :key="album.id" class="album">
+ <div v-for="album in albums" :key="album.id" class="album">
<div class="field">
<b-checkbox
:value="isAlbumSelected(album.id)"
@@ -252,7 +252,7 @@ export default {
methods: {
async search() {
const data = await this.$search.do(this.searchTerm, ['name', 'original', 'type', 'albums:name']);
- console.log('> Search result data', data);
+ console.log('> Search result data', data); // eslint-disable-line no-console
},
deleteFile(file) {
// this.$emit('delete', file);
diff --git a/src/site/components/loading/CubeShadow.vue b/src/site/components/loading/CubeShadow.vue
index af31dac..bbfdb52 100644
--- a/src/site/components/loading/CubeShadow.vue
+++ b/src/site/components/loading/CubeShadow.vue
@@ -1,5 +1,6 @@
<template>
- <div :style="styles"
+ <div
+ :style="styles"
class="spinner spinner--cube-shadow" />
</template>
@@ -8,16 +9,16 @@ export default {
props: {
size: {
type: String,
- default: '60px'
+ default: '60px',
},
background: {
type: String,
- default: '#9C27B0'
+ default: '#9C27B0',
},
duration: {
type: String,
- default: '1.8s'
- }
+ default: '1.8s',
+ },
},
computed: {
styles() {
@@ -25,10 +26,10 @@ export default {
width: this.size,
height: this.size,
backgroundColor: this.background,
- animationDuration: this.duration
+ animationDuration: this.duration,
};
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/components/loading/Origami.vue b/src/site/components/loading/Origami.vue
index d1b523d..cd1c087 100644
--- a/src/site/components/loading/Origami.vue
+++ b/src/site/components/loading/Origami.vue
@@ -1,7 +1,9 @@
<template>
- <div :style="styles"
+ <div
+ :style="styles"
class="spinner spinner-origami">
- <div :style="innerStyles"
+ <div
+ :style="innerStyles"
class="spinner-inner loading">
<span class="slice" />
<span class="slice" />
@@ -18,21 +20,21 @@ export default {
props: {
size: {
type: String,
- default: '40px'
- }
+ default: '40px',
+ },
},
computed: {
innerStyles() {
- let size = parseInt(this.size);
+ const size = parseInt(this.size, 10);
return { transform: `scale(${(size / 60)})` };
},
styles() {
return {
width: this.size,
- height: this.size
+ height: this.size,
};
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/components/loading/PingPong.vue b/src/site/components/loading/PingPong.vue
index ac33e28..d562e9f 100644
--- a/src/site/components/loading/PingPong.vue
+++ b/src/site/components/loading/PingPong.vue
@@ -1,12 +1,14 @@
<template>
- <div :style="styles"
+ <div
+ :style="styles"
class="spinner spinner--ping-pong">
- <div :style="innerStyles"
+ <div
+ :style="innerStyles"
class="spinner-inner">
<div class="board">
- <div class="left"/>
- <div class="right"/>
- <div class="ball"/>
+ <div class="left" />
+ <div class="right" />
+ <div class="ball" />
</div>
</div>
</div>
@@ -17,22 +19,22 @@ export default {
props: {
size: {
type: String,
- default: '60px'
- }
+ default: '60px',
+ },
},
computed: {
innerStyles() {
- let size = parseInt(this.size);
+ const size = parseInt(this.size, 10);
return { transform: `scale(${size / 250})` };
},
styles() {
return {
width: this.size,
- height: this.size
+ height: this.size,
};
- }
- }
-}
+ },
+ },
+};
</script>
<style lang="scss" scoped>
diff --git a/src/site/components/loading/RotateSquare.vue b/src/site/components/loading/RotateSquare.vue
index 4da8300..089e01a 100644
--- a/src/site/components/loading/RotateSquare.vue
+++ b/src/site/components/loading/RotateSquare.vue
@@ -1,5 +1,6 @@
<template>
- <div :style="styles"
+ <div
+ :style="styles"
class="spinner spinner--rotate-square-2" />
</template>
@@ -8,18 +9,18 @@ export default {
props: {
size: {
type: String,
- default: '40px'
- }
+ default: '40px',
+ },
},
computed: {
styles() {
return {
width: this.size,
height: this.size,
- display: 'inline-block'
+ display: 'inline-block',
};
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/components/uploader/Uploader.vue b/src/site/components/uploader/Uploader.vue
index c7be372..7e2d446 100644
--- a/src/site/components/uploader/Uploader.vue
+++ b/src/site/components/uploader/Uploader.vue
@@ -172,6 +172,7 @@ export default {
text: 'There was an error uploading this file. Check the console.',
error: true,
});
+ // eslint-disable-next-line no-console
console.error(file, message, xhr);
},
async dropzoneChunksUploaded(file, done) {
diff --git a/src/site/layouts/default.vue b/src/site/layouts/default.vue
index 579a73e..13a56c0 100644
--- a/src/site/layouts/default.vue
+++ b/src/site/layouts/default.vue
@@ -1,27 +1,29 @@
<template>
- <div v-bar
+ <div
+ v-bar
class="scroll-area">
<div class="default-body">
<Navbar :isWhite="true" />
- <nuxt-child id="app"
+ <nuxt-child
+ id="app"
class="nuxt-app is-height-max-content" />
<Footer />
</div>
</div>
</template>
<script>
-import Navbar from '~/components/navbar/Navbar.vue';
-import Footer from '~/components/footer/Footer';
import { mapState } from 'vuex';
+import Navbar from '~/components/navbar/Navbar.vue';
+import Footer from '~/components/footer/Footer.vue';
export default {
components: {
Navbar,
- Footer
+ Footer,
},
computed: mapState(['config']),
created() {
- this.$store.watch(state => state.alert.text, () => {
+ this.$store.watch((state) => state.alert.text, () => {
const { text, error } = this.$store.state.alert;
if (!text) return;
@@ -30,20 +32,21 @@ export default {
duration: 3500,
message: text,
position: 'is-bottom',
- type: error ? 'is-danger' : 'is-success'
+ type: error ? 'is-danger' : 'is-success',
});
this.$store.dispatch('alert/clear', null);
- })
+ });
},
mounted() {
+ // eslint-disable-next-line no-console
console.log(
`%c lolisafe %c v${this.config.version} %c`,
'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff',
'background:#ff015b; padding: 1px; border-radius: 0 3px 3px 0; color: #fff',
- 'background:transparent'
+ 'background:transparent',
);
- }
+ },
};
</script>
diff --git a/src/site/layouts/error.vue b/src/site/layouts/error.vue
index 77d188f..3f12c46 100644
--- a/src/site/layouts/error.vue
+++ b/src/site/layouts/error.vue
@@ -23,6 +23,6 @@
import Navbar from '~/components/navbar/Navbar.vue';
export default {
- components: { Navbar }
+ components: { Navbar },
};
</script>
diff --git a/src/site/middleware/admin.js b/src/site/middleware/admin.js
index 5c09220..1a94b75 100644
--- a/src/site/middleware/admin.js
+++ b/src/site/middleware/admin.js
@@ -1,5 +1,6 @@
-export default function({ store, redirect }) {
+export default function ({ store, redirect }) {
// If the user is not authenticated
if (!store.state.auth.user) return redirect('/login');
if (!store.state.auth.user.isAdmin) return redirect('/dashboard');
+ return true;
}
diff --git a/src/site/middleware/auth.js b/src/site/middleware/auth.js
index c3f339c..b2ecc68 100644
--- a/src/site/middleware/auth.js
+++ b/src/site/middleware/auth.js
@@ -1,6 +1,7 @@
-export default function({ store, redirect }) {
+export default function ({ store, redirect }) {
// If the user is not authenticated
if (!store.state.auth.loggedIn) {
return redirect('/login');
}
+ return true;
}
diff --git a/src/site/pages/dashboard/admin/file/_id.vue b/src/site/pages/dashboard/admin/file/_id.vue
index 5853770..34fcd01 100644
--- a/src/site/pages/dashboard/admin/file/_id.vue
+++ b/src/site/pages/dashboard/admin/file/_id.vue
@@ -9,74 +9,90 @@
<Sidebar />
</div>
<div class="column">
- <h2 class="subtitle">File details</h2>
+ <h2 class="subtitle">
+ File details
+ </h2>
<hr>
<div class="columns">
<div class="column is-6">
- <b-field label="ID"
+ <b-field
+ label="ID"
horizontal>
<span>{{ file.id }}</span>
</b-field>
- <b-field label="Name"
+ <b-field
+ label="Name"
horizontal>
<span>{{ file.name }}</span>
</b-field>
- <b-field label="Original Name"
+ <b-field
+ label="Original Name"
horizontal>
<span>{{ file.original }}</span>
</b-field>
- <b-field label="IP"
+ <b-field
+ label="IP"
horizontal>
<span class="underline">{{ file.ip }}</span>
</b-field>
- <b-field label="Link"
+ <b-field
+ label="Link"
horizontal>
- <a :href="file.url"
+ <a
+ :href="file.url"
target="_blank">{{ file.url }}</a>
</b-field>
- <b-field label="Size"
+ <b-field
+ label="Size"
horizontal>
<span>{{ formatBytes(file.size) }}</span>
</b-field>
- <b-field label="Hash"
+ <b-field
+ label="Hash"
horizontal>
<span>{{ file.hash }}</span>
</b-field>
- <b-field label="Uploaded"
+ <b-field
+ label="Uploaded"
horizontal>
<span><timeago :since="file.createdAt" /></span>
</b-field>
</div>
<div class="column is-6">
- <b-field label="User Id"
+ <b-field
+ label="User Id"
horizontal>
<span>{{ user.id }}</span>
</b-field>
- <b-field label="Username"
+ <b-field
+ label="Username"
horizontal>
<span>{{ user.username }}</span>
</b-field>
- <b-field label="Enabled"
+ <b-field
+ label="Enabled"
horizontal>
<span>{{ user.enabled }}</span>
</b-field>
- <b-field label="Registered"
+ <b-field
+ label="Registered"
horizontal>
<span><timeago :since="user.createdAt" /></span>
</b-field>
- <b-field label="Files"
+ <b-field
+ label="Files"
horizontal>
<span>
<nuxt-link :to="`/dashboard/admin/user/${user.id}`">{{ user.fileCount }}</nuxt-link>
@@ -86,10 +102,16 @@
</div>
<div class="mb2 mt2 text-center">
- <button class="button is-danger"
- @click="promptBanIP">Ban IP</button>
- <button class="button is-danger"
- @click="promptDisableUser">Disable user</button>
+ <button
+ class="button is-danger"
+ @click="promptBanIP">
+ Ban IP
+ </button>
+ <button
+ class="button is-danger"
+ @click="promptDisableUser">
+ Disable user
+ </button>
</div>
</div>
</div>
@@ -102,14 +124,14 @@ import Sidebar from '~/components/sidebar/Sidebar.vue';
export default {
components: {
- Sidebar
+ Sidebar,
},
middleware: ['auth', 'admin'],
data() {
return {
options: {},
file: null,
- user: null
+ user: null,
};
},
async asyncData({ $axios, route }) {
@@ -117,13 +139,13 @@ export default {
const response = await $axios.$get(`file/${route.params.id}`);
return {
file: response.file ? response.file : null,
- user: response.user ? response.user : null
+ user: response.user ? response.user : null,
};
} catch (error) {
console.error(error);
return {
file: null,
- user: null
+ user: null,
};
}
},
@@ -132,12 +154,12 @@ export default {
this.$buefy.dialog.confirm({
type: 'is-danger',
message: 'Are you sure you want to disable the account of the user that uploaded this file?',
- onConfirm: () => this.disableUser()
+ onConfirm: () => this.disableUser(),
});
},
async disableUser() {
const response = await this.$axios.$post('admin/users/disable', {
- id: this.user.id
+ id: this.user.id,
});
this.$buefy.toast.open(response.message);
},
@@ -145,12 +167,12 @@ export default {
this.$buefy.dialog.confirm({
type: 'is-danger',
message: 'Are you sure you want to ban the IP this file was uploaded from?',
- onConfirm: () => this.banIP()
+ onConfirm: () => this.banIP(),
});
},
async banIP() {
const response = await this.$axios.$post('admin/ban/ip', {
- ip: this.file.ip
+ ip: this.file.ip,
});
this.$buefy.toast.open(response.message);
},
@@ -163,8 +185,8 @@ export default {
const i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
- }
- }
+ return `${parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`;
+ },
+ },
};
</script>
diff --git a/src/site/pages/dashboard/admin/settings.vue b/src/site/pages/dashboard/admin/settings.vue
index 2d59fff..9e63a7c 100644
--- a/src/site/pages/dashboard/admin/settings.vue
+++ b/src/site/pages/dashboard/admin/settings.vue
@@ -6,87 +6,112 @@
<Sidebar />
</div>
<div class="column">
- <h2 class="subtitle">Service settings</h2>
+ <h2 class="subtitle">
+ Service settings
+ </h2>
<hr>
- <b-field label="Service name"
+ <b-field
+ label="Service name"
message="Please enter the name which this service is gonna be identified as"
horizontal>
- <b-input v-model="options.serviceName"
+ <b-input
+ v-model="options.serviceName"
expanded />
</b-field>
- <b-field label="Upload folder"
+ <b-field
+ label="Upload folder"
message="Where to store the files relative to the working directory"
horizontal>
- <b-input v-model="options.uploadFolder"
+ <b-input
+ v-model="options.uploadFolder"
expanded />
</b-field>
- <b-field label="Links per album"
+ <b-field
+ label="Links per album"
message="Maximum links allowed per album"
horizontal>
- <b-input v-model="options.linksPerAlbum"
+ <b-input
+ v-model="options.linksPerAlbum"
type="number"
expanded />
</b-field>
- <b-field label="Max upload size"
+ <b-field
+ label="Max upload size"
message="Maximum allowed file size in MB"
horizontal>
- <b-input v-model="options.maxUploadSize"
+ <b-input
+ v-model="options.maxUploadSize"
expanded />
</b-field>
- <b-field label="Filename length"
+ <b-field
+ label="Filename length"
message="How many characters long should the generated filenames be"
horizontal>
- <b-input v-model="options.filenameLength"
+ <b-input
+ v-model="options.filenameLength"
expanded />
</b-field>
- <b-field label="Album link length"
+ <b-field
+ label="Album link length"
message="How many characters a link for an album should have"
horizontal>
- <b-input v-model="options.albumLinkLength"
+ <b-input
+ v-model="options.albumLinkLength"
expanded />
</b-field>
- <b-field label="Generate thumbnails"
+ <b-field
+ label="Generate thumbnails"
message="Generate thumbnails when uploading a file if possible"
horizontal>
- <b-switch v-model="options.generateThumbnails"
+ <b-switch
+ v-model="options.generateThumbnails"
:true-value="true"
:false-value="false" />
</b-field>
- <b-field label="Generate zips"
+ <b-field
+ label="Generate zips"
message="Allow generating zips to download entire albums"
horizontal>
- <b-switch v-model="options.generateZips"
+ <b-switch
+ v-model="options.generateZips"
:true-value="true"
:false-value="false" />
</b-field>
- <b-field label="Public mode"
+ <b-field
+ label="Public mode"
message="Enable anonymous uploades"
horizontal>
- <b-switch v-model="options.publicMode"
+ <b-switch
+ v-model="options.publicMode"
:true-value="true"
:false-value="false" />
</b-field>
- <b-field label="Enable creating account"
+ <b-field
+ label="Enable creating account"
message="Enable creating new accounts in the platform"
horizontal>
- <b-switch v-model="options.enableAccounts"
+ <b-switch
+ v-model="options.enableAccounts"
:true-value="true"
:false-value="false" />
</b-field>
<div class="mb2 mt2 text-center">
- <button class="button is-primary"
- @click="promptRestartService">Save and restart service</button>
+ <button
+ class="button is-primary"
+ @click="promptRestartService">
+ Save and restart service
+ </button>
</div>
</div>
</div>
@@ -99,12 +124,12 @@ import Sidebar from '~/components/sidebar/Sidebar.vue';
export default {
components: {
- Sidebar
+ Sidebar,
},
middleware: ['auth', 'admin'],
data() {
return {
- options: {}
+ options: {},
};
},
metaInfo() {
@@ -115,19 +140,19 @@ export default {
},
methods: {
async getSettings() {
- const response = await this.$axios.$get(`service/config`);
+ const response = await this.$axios.$get('service/config');
this.options = response.config;
},
promptRestartService() {
this.$buefy.dialog.confirm({
message: 'Keep in mind that restarting only works if you have PM2 or something similar set up. Continue?',
- onConfirm: () => this.restartService()
+ onConfirm: () => this.restartService(),
});
},
async restartService() {
- const response = await this.$axios.$post(`service/restart`);
+ const response = await this.$axios.$post('service/restart');
this.$buefy.toast.open(response.message);
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/pages/dashboard/tags/index.vue b/src/site/pages/dashboard/tags/index.vue
index a9476da..10193a8 100644
--- a/src/site/pages/dashboard/tags/index.vue
+++ b/src/site/pages/dashboard/tags/index.vue
@@ -123,7 +123,6 @@
}
</style>
-
<template>
<section class="section is-fullheight dashboard">
<div class="container">
@@ -132,27 +131,35 @@
<Sidebar />
</div>
<div class="column">
- <h2 class="subtitle">Manage your tags</h2>
+ <h2 class="subtitle">
+ Manage your tags
+ </h2>
<hr>
<div class="search-container">
<b-field>
- <b-input v-model="newTagName"
+ <b-input
+ v-model="newTagName"
placeholder="Tag name..."
type="text"
@keyup.enter.native="createTag" />
<p class="control">
- <button class="button is-primary"
- @click="createTag">Create tags</button>
+ <button
+ class="button is-primary"
+ @click="createTag">
+ Create tags
+ </button>
</p>
</b-field>
</div>
<div class="view-container">
- <div v-for="tag in tags"
+ <div
+ v-for="tag in tags"
:key="tag.id"
class="album">
- <div class="arrow-container"
+ <div
+ class="arrow-container"
@click="promptDeleteTag">
<i class="icon-arrow" />
</div>
@@ -165,7 +172,9 @@
-->
<div class="info">
<h4>
- <router-link :to="`/dashboard/tags/${tag.id}`">{{ tag.name }}</router-link>
+ <router-link :to="`/dashboard/tags/${tag.id}`">
+ {{ tag.name }}
+ </router-link>
</h4>
<span>{{ tag.count || 0 }} files</span>
</div>
@@ -205,19 +214,19 @@ import Sidebar from '~/components/sidebar/Sidebar.vue';
export default {
components: {
- Sidebar
+ Sidebar,
},
middleware: 'auth',
data() {
return {
tags: [],
- newTagName: null
+ newTagName: null,
};
},
computed: {
config() {
return this.$store.state.config;
- }
+ },
},
metaInfo() {
return { title: 'Tags' };
@@ -230,7 +239,7 @@ export default {
this.$buefy.dialog.confirm({
type: 'is-danger',
message: 'Are you sure you want to delete this tag?',
- onConfirm: () => this.promptPurgeTag(id)
+ onConfirm: () => this.promptPurgeTag(id),
});
},
promptPurgeTag(id) {
@@ -240,7 +249,7 @@ export default {
cancelText: 'No',
confirmText: 'Yes',
onConfirm: () => this.deleteTag(id, true),
- onCancel: () => this.deleteTag(id, false)
+ onCancel: () => this.deleteTag(id, false),
});
},
async deleteTag(id, purge) {
@@ -250,19 +259,19 @@ export default {
},
async createTag() {
if (!this.newTagName || this.newTagName === '') return;
- const response = await this.$axios.$post(`tag/new`,
+ const response = await this.$axios.$post('tag/new',
{ name: this.newTagName });
this.newTagName = null;
this.$buefy.toast.open(response.message);
this.getTags();
},
async getTags() {
- const response = await this.$axios.$get(`tags`);
+ const response = await this.$axios.$get('tags');
for (const tag of response.tags) {
tag.isDetailsOpen = false;
}
this.tags = response.tags;
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/pages/faq.vue b/src/site/pages/faq.vue
index bb84a7d..85e8744 100644
--- a/src/site/pages/faq.vue
+++ b/src/site/pages/faq.vue
@@ -1,34 +1,45 @@
<template>
+ <!-- eslint-disable max-len -->
<div class="container has-text-left">
- <h2 class="subtitle">What is lolisafe?</h2>
+ <h2 class="subtitle">
+ What is lolisafe?
+ </h2>
<article class="message">
<div class="message-body">
lolisafe is an easy to use, open source and completely free file upload service. We accept your files, photos, documents, anything, and give you back a shareable link for you to send to others.
</div>
</article>
- <h2 class="subtitle">Can I run my own lolisafe?</h2>
+ <h2 class="subtitle">
+ Can I run my own lolisafe?
+ </h2>
<article class="message">
<div class="message-body">
Definitely. Head to <a target="_blank" href="https://github.com/WeebDev/lolisafe">our GitHub repo</a> and follow the instructions to clone, build and deploy it by yourself. It's super easy too!
</div>
</article>
- <h2 class="subtitle">How can I keep track of my uploads?</h2>
+ <h2 class="subtitle">
+ How can I keep track of my uploads?
+ </h2>
<article class="message">
<div class="message-body">
Simply create a user on the site and every upload will be associated with your account, granting you access to your uploaded files through our dashboard.
</div>
</article>
- <h2 class="subtitle">What are albums?</h2>
+ <h2 class="subtitle">
+ What are albums?
+ </h2>
<article class="message">
<div class="message-body">
Albums are a simple way of sorting uploads together. Right now you can create albums through the dashboard and use them only with <a target="_blank" href="https://chrome.google.com/webstore/detail/loli-safe-uploader/enkkmplljfjppcdaancckgilmgoiofnj">our chrome extension</a> which will enable you to <strong>right click -&gt; send to lolisafe</strong> or to a desired album if you have any.
</div>
</article>
- <h2 class="subtitle">Why should I use this?</h2>
+ <h2 class="subtitle">
+ Why should I use this?
+ </h2>
<article class="message">
<div class="message-body">
There are too many file upload services out there, and a lot of them rely on the foundations of pomf which is ancient. In a desperate and unsuccessful attempt of finding a good file uploader that's easily extendable, lolisafe was born. We give you control over your files, we give you a way to sort your uploads into albums for ease of access and we give you an api to use with ShareX or any other thing that let's you make POST requests.
@@ -45,7 +56,7 @@ export default {
},
metaInfo() {
return { title: 'Faq' };
- }
+ },
};
</script>
diff --git a/src/site/pages/index.vue b/src/site/pages/index.vue
index c8fb7b8..a28eea4 100644
--- a/src/site/pages/index.vue
+++ b/src/site/pages/index.vue
@@ -11,6 +11,7 @@
<div class="content-wrapper">
<h4>Blazing fast file uploader. <br>For real.</h4>
<p>
+ <!-- eslint-disable-next-line max-len -->
A <strong>modern</strong> and <strong>self-hosted</strong> file upload service that can handle anything you throw at it. Fast uploads, file manager and sharing capabilities all crafted with a beautiful user experience in mind.
</p>
</div>
diff --git a/src/site/pages/register.vue b/src/site/pages/register.vue
index 92eb35a..1216dc1 100644
--- a/src/site/pages/register.vue
+++ b/src/site/pages/register.vue
@@ -10,18 +10,21 @@
<div class="columns">
<div class="column is-4 is-offset-4">
<b-field>
- <b-input v-model="username"
+ <b-input
+ v-model="username"
type="text"
placeholder="Username" />
</b-field>
<b-field>
- <b-input v-model="password"
+ <b-input
+ v-model="password"
type="password"
placeholder="Password"
password-reveal />
</b-field>
<b-field>
- <b-input v-model="rePassword"
+ <b-input
+ v-model="rePassword"
type="password"
placeholder="Re-type Password"
password-reveal
@@ -29,11 +32,17 @@
</b-field>
<p class="control has-addons is-pulled-right">
- <router-link to="/login"
- class="is-text">Already have an account?</router-link>
- <button class="button is-primary big ml1"
+ <router-link
+ to="/login"
+ class="is-text">
+ Already have an account?
+ </router-link>
+ <button
+ class="button is-primary big ml1"
:disabled="isLoading"
- @click="register">Register</button>
+ @click="register">
+ Register
+ </button>
</p>
</div>
</div>
@@ -51,7 +60,7 @@ export default {
username: null,
password: null,
rePassword: null,
- isLoading: false
+ isLoading: false,
};
},
computed: mapState(['config', 'auth']),
@@ -64,23 +73,23 @@ export default {
if (!this.username || !this.password || !this.rePassword) {
this.$store.dispatch('alert', {
text: 'Please fill all fields before attempting to register.',
- error: true
+ error: true,
});
return;
}
if (this.password !== this.rePassword) {
this.$store.dispatch('alert', {
text: "Passwords don't match",
- error: true
+ error: true,
});
return;
}
this.isLoading = true;
try {
- const response = await this.$axios.$post(`auth/register`, {
+ const response = await this.$axios.$post('auth/register', {
username: this.username,
- password: this.password
+ password: this.password,
});
this.$store.dispatch('alert', { text: response.message });
@@ -90,7 +99,7 @@ export default {
} finally {
this.isLoading = false;
}
- }
- }
+ },
+ },
};
</script>
diff --git a/src/site/plugins/axios.js b/src/site/plugins/axios.js
index 2f4a169..378f922 100644
--- a/src/site/plugins/axios.js
+++ b/src/site/plugins/axios.js
@@ -1,25 +1,25 @@
-export default function({ $axios, store }) {
+export default function ({ $axios, store }) {
$axios.setHeader('accept', 'application/vnd.lolisafe.json');
- $axios.onRequest(config => {
+ $axios.onRequest((config) => {
if (store.state.auth.token) {
- config.headers.common['Authorization'] = `bearer ${store.state.auth.token}`;
+ config.headers.common.Authorization = `bearer ${store.state.auth.token}`;
}
});
- $axios.onError(error => {
+ $axios.onError((error) => {
if (process.env.NODE_ENV !== 'production') console.error('[AXIOS Error]', error);
if (process.browser) {
if (process.env.NODE_ENV !== 'production') {
if (error.response?.data?.message) {
store.dispatch('alert/set', {
text: error.response.data.message,
- error: true
+ error: true,
});
} else {
store.dispatch('alert/set', {
text: `[AXIOS]: ${error.message}`,
- error: true
+ error: true,
});
}
}
diff --git a/src/site/plugins/flexsearch.js b/src/site/plugins/flexsearch.js
index 595b180..8640232 100644
--- a/src/site/plugins/flexsearch.js
+++ b/src/site/plugins/flexsearch.js
@@ -1,16 +1,17 @@
import Vue from 'vue';
import FlexSearch from 'flexsearch';
+
const search = new FlexSearch('speed');
// https://github.com/nextapps-de/flexsearch
Vue.prototype.$search = {
- items: async items => {
+ items: async (items) => {
await search.clear();
await search.add(items);
},
do: async (term, field) => {
const results = await search.search(term, { field });
return results;
- }
+ },
};
diff --git a/src/site/plugins/nuxt-client-init.js b/src/site/plugins/nuxt-client-init.js
index 4b10dcd..01f33ff 100644
--- a/src/site/plugins/nuxt-client-init.js
+++ b/src/site/plugins/nuxt-client-init.js
@@ -1,3 +1,3 @@
-export default async ctx => {
+export default async (ctx) => {
await ctx.store.dispatch('nuxtClientInit', ctx);
};
diff --git a/src/site/plugins/vue-isyourpasswordsafe.js b/src/site/plugins/vue-isyourpasswordsafe.js
index 6172ca0..68f313a 100644
--- a/src/site/plugins/vue-isyourpasswordsafe.js
+++ b/src/site/plugins/vue-isyourpasswordsafe.js
@@ -3,5 +3,5 @@ import VueIsYourPasswordSafe from 'vue-isyourpasswordsafe';
Vue.use(VueIsYourPasswordSafe, {
minLength: 6,
- maxLength: 64
+ maxLength: 64,
});
diff --git a/src/site/plugins/vue-timeago.js b/src/site/plugins/vue-timeago.js
index 28f3c6d..81e6e75 100644
--- a/src/site/plugins/vue-timeago.js
+++ b/src/site/plugins/vue-timeago.js
@@ -4,5 +4,5 @@ import VueTimeago from 'vue-timeago';
Vue.use(VueTimeago, {
name: 'timeago',
locale: 'en-US',
- locales: { 'en-US': require('vue-timeago/locales/en-US.json') }
+ locales: { 'en-US': require('vue-timeago/locales/en-US.json') },
});
diff --git a/src/site/store/auth.js b/src/site/store/auth.js
index 286d321..fcc051b 100644
--- a/src/site/store/auth.js
+++ b/src/site/store/auth.js
@@ -49,6 +49,8 @@ export const actions = {
} catch (e) {
dispatch('alert/set', { text: e.message, error: true }, { root: true });
}
+
+ return null;
},
async requestAPIKey({ commit, dispatch }) {
try {
@@ -59,6 +61,8 @@ export const actions = {
} catch (e) {
dispatch('alert/set', { text: e.message, error: true }, { root: true });
}
+
+ return null;
},
logout({ commit }) {
commit('logout');