Whalebird-desktop-client-ma.../src/main/db/account.ts

286 lines
7.9 KiB
TypeScript

import sqlite3 from 'sqlite3'
import { LocalAccount } from '~/src/types/localAccount'
import { LocalServer } from '~src/types/localServer'
export const insertAccount = (
db: sqlite3.Database,
username: string,
accountId: string,
avatar: string,
clientId: string,
clientSecret: string,
accessToken: string,
refreshToken: string | null,
server: LocalServer
): Promise<LocalAccount> => {
return new Promise((resolve, reject) => {
db.serialize(() => {
db.run('BEGIN TRANSACTION')
db.get('SELECT * FROM accounts ORDER BY sort DESC', (err, row) => {
if (err) {
reject(err)
}
let order = 1
if (row) {
order = row.sort + 1
}
db.run(
'INSERT INTO accounts(username, account_id, avatar, client_id, client_secret, access_token, refresh_token, sort) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[username, accountId, avatar, clientId, clientSecret, accessToken, refreshToken, order],
function (err) {
if (err) {
reject(err)
}
const id = this.lastID
db.run('UPDATE servers SET account_id = ? WHERE id = ?', [id, server.id], err => {
if (err) {
reject(err)
}
db.run('COMMIT')
resolve({
id,
username,
accountId,
avatar,
clientId,
clientSecret,
accessToken,
refreshToken,
order
})
})
}
)
})
})
})
}
/**
* List up authenticated accounts.
*/
export const listAccounts = (db: sqlite3.Database): Promise<Array<[LocalAccount, LocalServer]>> => {
return new Promise((resolve, reject) => {
db.all(
'SELECT \
accounts.id as id, \
accounts.username as username, \
accounts.account_id as remote_account_id, \
accounts.avatar as avatar, \
accounts.client_id as client_id, \
accounts.client_secret as client_secret, \
accounts.access_token as access_token, \
accounts.refresh_token as refresh_token, \
accounts.sort as sort, \
servers.id as server_id, \
servers.base_url as base_url, \
servers.domain as domain, \
servers.sns as sns, \
servers.account_id as account_id \
FROM accounts INNER JOIN servers ON servers.account_id = accounts.id ORDER BY accounts.sort',
(err, rows) => {
if (err) {
reject(err)
}
resolve(
rows.map(r => [
{
id: r.id,
username: r.username,
accountId: r.remote_account_id,
avatar: r.avatar,
clientId: r.client_id,
clientSecret: r.client_secret,
accessToken: r.access_token,
refreshToken: r.refresh_token,
order: r.sort
} as LocalAccount,
{
id: r.server_id,
baseURL: r.base_url,
domain: r.domain,
sns: r.sns,
accountId: r.account_id
} as LocalServer
])
)
}
)
})
}
export const getAccount = (db: sqlite3.Database, id: number): Promise<[LocalAccount, LocalServer]> => {
return new Promise((resolve, reject) => {
db.get(
'SELECT \
accounts.id as id, \
accounts.username as username, \
accounts.account_id as remote_account_id, \
accounts.avatar as avatar, \
accounts.client_id as client_id, \
accounts.client_secret as client_secret, \
accounts.access_token as access_token, \
accounts.refresh_token as refresh_token, \
accounts.sort as sort, \
servers.id as server_id, \
servers.base_url as base_url, \
servers.domain as domain, \
servers.sns as sns, \
servers.account_id as account_id \
FROM accounts INNER JOIN servers ON servers.account_id = accounts.id WHERE accounts.id = ?',
id,
(err, r) => {
if (err) {
reject(err)
}
resolve([
{
id: r.id,
username: r.username,
accountId: r.remote_account_id,
avatar: r.avatar,
clientId: r.client_id,
clientSecret: r.client_secret,
accessToken: r.access_token,
refreshToken: r.refresh_token,
order: r.sort
} as LocalAccount,
{
id: r.server_id,
baseURL: r.base_url,
domain: r.domain,
sns: r.sns,
accountId: r.account_id
} as LocalServer
])
}
)
})
}
export const removeAccount = (db: sqlite3.Database, id: number): Promise<null> => {
return new Promise((resolve, reject) => {
db.run('DELETE FROM accounts WHERE id = ?', id, err => {
if (err) {
reject(err)
}
resolve(null)
})
})
}
export const removeAllAccounts = (db: sqlite3.Database): Promise<null> => {
return new Promise((resolve, reject) => {
db.run('DELETE FROM accounts', err => {
if (err) {
reject(err)
}
resolve(null)
})
})
}
export const forwardAccount = (db: sqlite3.Database, id: number): Promise<null> => {
return new Promise((resolve, reject) => {
db.serialize(() => {
db.run('BEGIN TRANSACTION')
db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
const index = rows.findIndex(r => r.id === id)
if (index < 0 || index >= rows.length - 1) {
db.run('ROLLBACK TRANSACTION')
return resolve(null)
}
const target = rows[index + 1]
const base = rows[index]
db.serialize(() => {
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
db.run('COMMIT')
return resolve(null)
})
})
})
})
})
}
export const backwardAccount = (db: sqlite3.Database, id: number): Promise<null> => {
return new Promise((resolve, reject) => {
db.serialize(() => {
db.run('BEGIN TRANSACTION')
db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
const index = rows.findIndex(r => r.id === id)
if (index < 1) {
db.run('ROLLBACK TRANSACTION')
return resolve(null)
}
const target = rows[index - 1]
const base = rows[index]
db.serialize(() => {
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
})
db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => {
if (err) {
console.error(err)
db.run('ROLLBACK TRANSACTION')
return reject(err)
}
db.run('COMMIT')
return resolve(null)
})
})
})
})
})
}