From e25c8ac6419c4cedd22d6815242e131f97dbbac3 Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Thu, 11 Oct 2018 23:12:22 +0900
Subject: [PATCH] refs #651 Reoreder accounts and fix order method
---
src/main/account.js | 194 ++++++++++++++++------
src/main/auth.js | 9 +-
src/main/index.js | 50 +++---
src/renderer/store/Preferences/Account.js | 2 +
4 files changed, 170 insertions(+), 85 deletions(-)
diff --git a/src/main/account.js b/src/main/account.js
index 837221c3..03209f8d 100644
--- a/src/main/account.js
+++ b/src/main/account.js
@@ -6,6 +6,56 @@ export default class Account {
this.db = db
}
+ async initialize () {
+ await this.updateUnique()
+ await this.cleanup()
+ await this.reorder()
+ }
+
+ updateUnique () {
+ return new Promise((resolve, reject) => {
+ // At first, remove old index.
+ this.db.removeIndex('order', (err) => {
+ if (err) reject(err)
+ // Add unique index.
+ this.db.ensureIndex({ fieldName: 'order', unique: true, sparse: true }, (err) => {
+ if (err) reject(err)
+ resolve(null)
+ })
+ })
+ })
+ }
+
+ /**
+ * Reorder accounts, because sometimes the order of accounts is duplicated.
+ */
+ async reorder () {
+ const accounts = await this.listAllAccounts()
+ await Promise.all(accounts.map(async (account, index) => {
+ const update = await this.updateAccount(account._id, Object.assign(account, { order: index + 1 }))
+ return update
+ }))
+ const ordered = await this.listAllAccounts()
+ return ordered
+ }
+
+ /**
+ * Check order of all accounts, and fix if order is negative value or over the length.
+ */
+ async cleanup () {
+ const accounts = await this.listAccounts()
+ if (accounts.length < 1) {
+ return accounts.length
+ }
+ if (accounts[0].order < 1 || accounts[accounts.length - 1].order > accounts.length) {
+ await Promise.all(accounts.map(async (element, index) => {
+ const update = await this.updateAccount(element._id, Object.assign(element, { order: index + 1 }))
+ return update
+ }))
+ }
+ return null
+ }
+
insertAccount (obj) {
return new Promise((resolve, reject) => {
this.db.insert(obj, (err, doc) => {
@@ -16,6 +66,22 @@ export default class Account {
})
}
+ /**
+ * List up all accounts either authenticated or not authenticated.
+ */
+ listAllAccounts (order = 1) {
+ return new Promise((resolve, reject) => {
+ this.db.find().sort({ order: order }).exec((err, docs) => {
+ if (err) return reject(err)
+ if (empty(docs)) return reject(new EmptyRecordError('empty'))
+ resolve(docs)
+ })
+ })
+ }
+
+ /**
+ * List up authenticated accounts.
+ */
listAccounts () {
return new Promise((resolve, reject) => {
this.db.find({accessToken: { $ne: '' }}).sort({ order: 1 }).exec((err, docs) => {
@@ -26,13 +92,10 @@ export default class Account {
})
}
- countAuthorizedAccounts () {
- return new Promise((resolve, reject) => {
- this.db.count({accessToken: { $ne: '' }}, (err, count) => {
- if (err) return reject(err)
- resolve(count)
- })
- })
+ // Get the last account.
+ async lastAccount () {
+ const accounts = await this.listAllAccounts(-1)
+ return accounts[0]
}
getAccount (id) {
@@ -62,14 +125,12 @@ export default class Account {
})
}
- searchAccounts (obj) {
+ searchAccounts (obj, order = 1) {
return new Promise((resolve, reject) => {
- this.db.find(
- obj,
- (err, docs) => {
- if (err) return reject(err)
- resolve(docs)
- })
+ this.db.find(obj).sort({ order: order }).exec((err, docs) => {
+ if (err) return reject(err)
+ resolve(docs)
+ })
})
}
@@ -126,54 +187,81 @@ export default class Account {
}
async forwardAccount (ac) {
- if (ac.order <= 1) {
- return ac.order
+ // Find account which is the previous of the target account.
+ const accounts = await this.searchAccounts({ order: { $lt: ac.order } }, -1)
+ .catch((err) => {
+ console.log(err)
+ return []
+ })
+ if (accounts.length < 1) {
+ return null
}
- // Find account which is backwarded
- const backwarded = await this.searchAccount(
+ const previousAccount = accounts[0]
+ const targetOrder = ac.order
+ const previousOrder = previousAccount.order
+
+ // At first, we need to update the previous account with dummy order.
+ // Because this column is uniqued, so can not update with same order.
+ await this.updateAccount(previousAccount._id, Object.assign(
+ previousAccount,
{
- order: ac.order - 1
+ order: -1
}
- )
- await this.updateAccount(backwarded._id, Object.assign(backwarded, { order: (backwarded.order + 1) }))
- // Forward account order
- const updated = await this.updateAccount(ac._id, Object.assign(ac, { order: (ac.order - 1) }))
+ ))
+ // Change order of the target account.
+ const updated = await this.updateAccount(ac._id, Object.assign(
+ ac,
+ {
+ order: previousOrder
+ }
+ ))
+ // Update the previous account with right order.
+ await this.updateAccount(previousAccount._id, Object.assign(
+ previousAccount,
+ {
+ order: targetOrder
+ }
+ ))
return updated
}
async backwardAccount (ac) {
- const length = await this.countAuthorizedAccounts()
- if (ac.order >= length) {
- return ac.order
- }
- // Find account which is forwarded
- const forwarded = await this.searchAccount(
- {
- order: ac.order + 1
- }
- )
- await this.updateAccount(forwarded._id, Object.assign(forwarded, { order: (forwarded.order - 1) }))
- // Backward account order
- const updated = await this.updateAccount(ac._id, Object.assign(ac, { order: (ac.order + 1) }))
- return updated
- }
-
- /*
- * cleanup
- * Check order of all accounts, and fix if order is negative value or over the length.
- */
- async cleanup () {
- const accounts = await this.listAccounts()
+ // Find account which is the next of the target account.
+ const accounts = await this.searchAccounts({ order: { $gt: ac.order } }, 1)
+ .catch((err) => {
+ console.log(err)
+ return []
+ })
if (accounts.length < 1) {
- return accounts.length
+ return null
}
- if (accounts[0].order < 1 || accounts[accounts.length - 1].order > accounts.length) {
- await Promise.all(accounts.map(async (element, index) => {
- const update = await this.updateAccount(element._id, Object.assign(element, { order: index + 1 }))
- return update
- }))
- }
- return null
+ const nextAccount = accounts[0]
+ const targetOrder = ac.order
+ const nextOrder = nextAccount.order
+
+ // At first, we need to update the next account with dummy order.
+ // Because this colum is uniqued, so can not update with same order.
+ await this.updateAccount(nextAccount._id, Object.assign(
+ nextAccount,
+ {
+ order: -1
+ }
+ ))
+ // Change order of the target account/
+ const updated = await this.updateAccount(ac._id, Object.assign(
+ ac,
+ {
+ order: nextOrder
+ }
+ ))
+ // Update the next account with right order.
+ await this.updateAccount(nextAccount._id, Object.assign(
+ nextAccount,
+ {
+ order: targetOrder
+ }
+ ))
+ return updated
}
async refreshAccounts () {
diff --git a/src/main/auth.js b/src/main/auth.js
index b50a11a9..b3d8c7dd 100644
--- a/src/main/auth.js
+++ b/src/main/auth.js
@@ -33,7 +33,12 @@ export default class Authentication {
this.clientId = res.clientId
this.clientSecret = res.clientSecret
- const count = await this.db.countAuthorizedAccounts()
+ const order = await this.db.lastAccount()
+ .then(account => account.order + 1)
+ .catch((err) => {
+ console.log(err)
+ return 1
+ })
const json = {
baseURL: this.baseURL,
domain: this.domain,
@@ -43,7 +48,7 @@ export default class Authentication {
username: '',
accountId: '',
avatar: '',
- order: count + 1
+ order: order
}
await this.db.insertAccount(json)
return res.url
diff --git a/src/main/index.js b/src/main/index.js
index a4aeeac7..fb1dbdc0 100644
--- a/src/main/index.js
+++ b/src/main/index.js
@@ -58,6 +58,10 @@ let accountDB = new Datastore({
filename: accountDBPath,
autoload: true
})
+const accountManager = new Account(accountDB)
+accountManager.initialize()
+ .catch(err => log.error(err))
+
const hashtagsDBPath = process.env.NODE_ENV === 'production'
? userData + '/db/hashtags.db'
: 'hashtags.db'
@@ -76,9 +80,7 @@ const soundBasePath = process.env.NODE_ENV === 'development'
async function listAccounts () {
try {
- const account = new Account(accountDB)
- await account.cleanup()
- const accounts = await account.listAccounts()
+ const accounts = await accountManager.listAccounts()
return accounts
} catch (err) {
return []
@@ -240,7 +242,7 @@ app.on('activate', () => {
}
})
-let auth = new Authentication(new Account(accountDB))
+let auth = new Authentication(accountManager)
ipcMain.on('get-auth-url', (event, domain) => {
auth.getAuthorizationUrl(domain)
@@ -284,8 +286,7 @@ ipcMain.on('get-social-token', (event, _) => {
// nedb
ipcMain.on('list-accounts', (event, _) => {
- const account = new Account(accountDB)
- account.listAccounts()
+ accountManager.listAccounts()
.catch((err) => {
log.error(err)
event.sender.send('error-list-accounts', err)
@@ -296,8 +297,7 @@ ipcMain.on('list-accounts', (event, _) => {
})
ipcMain.on('get-local-account', (event, id) => {
- const account = new Account(accountDB)
- account.getAccount(id)
+ accountManager.getAccount(id)
.catch((err) => {
log.error(err)
event.sender.send('error-get-local-account', err)
@@ -308,8 +308,7 @@ ipcMain.on('get-local-account', (event, id) => {
})
ipcMain.on('update-account', (event, acct) => {
- const account = new Account(accountDB)
- account.refresh(acct)
+ accountManager.refresh(acct)
.then((ac) => {
event.sender.send('response-update-account', ac)
})
@@ -319,8 +318,7 @@ ipcMain.on('update-account', (event, acct) => {
})
ipcMain.on('remove-account', (event, id) => {
- const account = new Account(accountDB)
- account.removeAccount(id)
+ accountManager.removeAccount(id)
.then(() => {
event.sender.send('response-remove-account')
})
@@ -330,19 +328,18 @@ ipcMain.on('remove-account', (event, id) => {
})
ipcMain.on('forward-account', (event, acct) => {
- const account = new Account(accountDB)
- account.forwardAccount(acct)
+ accountManager.forwardAccount(acct)
.then(() => {
event.sender.send('response-forward-account')
})
.catch((err) => {
+ log.error(err)
event.sender.send('error-forward-account', err)
})
})
ipcMain.on('backward-account', (event, acct) => {
- const account = new Account(accountDB)
- account.backwardAccount(acct)
+ accountManager.backwardAccount(acct)
.then(() => {
event.sender.send('response-backward-account')
})
@@ -352,8 +349,7 @@ ipcMain.on('backward-account', (event, acct) => {
})
ipcMain.on('refresh-accounts', (event, _) => {
- const account = new Account(accountDB)
- account.refreshAccounts()
+ accountManager.refreshAccounts()
.then((accounts) => {
event.sender.send('response-refresh-accounts', accounts)
})
@@ -363,8 +359,7 @@ ipcMain.on('refresh-accounts', (event, _) => {
})
ipcMain.on('remove-all-accounts', (event, _) => {
- const account = new Account(accountDB)
- account.removeAll()
+ accountManager.removeAll()
.then(() => {
event.sender.send('response-remove-all-accounts')
})
@@ -385,8 +380,7 @@ ipcMain.on('reset-badge', () => {
let userStreaming = null
ipcMain.on('start-user-streaming', (event, ac) => {
- const account = new Account(accountDB)
- account.getAccount(ac._id)
+ accountManager.getAccount(ac._id)
.catch((err) => {
log.error(err)
event.sender.send('error-start-user-streaming', err)
@@ -427,8 +421,7 @@ ipcMain.on('stop-user-streaming', (event, _) => {
let localStreaming = null
ipcMain.on('start-local-streaming', (event, ac) => {
- const account = new Account(accountDB)
- account.getAccount(ac._id)
+ accountManager.getAccount(ac._id)
.catch((err) => {
log.error(err)
event.sender.send('error-start-local-streaming', err)
@@ -465,8 +458,7 @@ ipcMain.on('stop-local-streaming', (event, _) => {
let publicStreaming = null
ipcMain.on('start-public-streaming', (event, ac) => {
- const account = new Account(accountDB)
- account.getAccount(ac._id)
+ accountManager.getAccount(ac._id)
.catch((err) => {
log.error(err)
event.sender.send('error-start-public-streaming', err)
@@ -503,8 +495,7 @@ ipcMain.on('stop-public-streaming', (event, _) => {
let listStreaming = null
ipcMain.on('start-list-streaming', (event, obj) => {
- const account = new Account(accountDB)
- account.getAccount(obj.account._id)
+ accountManager.getAccount(obj.account._id)
.catch((err) => {
log.error(err)
event.sender.send('error-start-list-streaming', err)
@@ -541,8 +532,7 @@ ipcMain.on('stop-list-streaming', (event, _) => {
let tagStreaming = null
ipcMain.on('start-tag-streaming', (event, obj) => {
- const account = new Account(accountDB)
- account.getAccount(obj.account._id)
+ accountManager.getAccount(obj.account._id)
.catch((err) => {
log.error(err)
event.sender.send('error-start-tag-streaming', err)
diff --git a/src/renderer/store/Preferences/Account.js b/src/renderer/store/Preferences/Account.js
index dd06e0a3..b7d4540c 100644
--- a/src/renderer/store/Preferences/Account.js
+++ b/src/renderer/store/Preferences/Account.js
@@ -43,6 +43,7 @@ const Account = {
})
},
forwardAccount ({ commit }, account) {
+ console.log(account)
return new Promise((resolve, reject) => {
ipcRenderer.send('forward-account', account)
ipcRenderer.once('error-forward-account', (event, err) => {
@@ -56,6 +57,7 @@ const Account = {
})
},
backwardAccount ({ commit }, account) {
+ console.log(account)
return new Promise((resolve, reject) => {
ipcRenderer.send('backward-account', account)
ipcRenderer.once('error-backward-account', (event, err) => {