wip
This commit is contained in:
parent
ef79903811
commit
df71c90f9f
|
@ -5,6 +5,15 @@ ChangeLog
|
|||
|
||||
This document describes breaking changes only.
|
||||
|
||||
7.0.0
|
||||
-----
|
||||
|
||||
### Migration
|
||||
|
||||
起動する前に、`node cli/migration/7.0.0`してください。
|
||||
|
||||
Please run `node cli/migration/7.0.0` before launch.
|
||||
|
||||
6.0.0
|
||||
-----
|
||||
|
||||
|
|
134
cli/migration/7.0.0.js
Normal file
134
cli/migration/7.0.0.js
Normal file
|
@ -0,0 +1,134 @@
|
|||
const { default: Chart } = require('../../built/models/chart');
|
||||
const { default: User } = require('../../built/models/user');
|
||||
const { default: Note } = require('../../built/models/note');
|
||||
const { default: DriveFile } = require('../../built/models/drive-file');
|
||||
|
||||
const now = new Date();
|
||||
const y = now.getFullYear();
|
||||
const m = now.getMonth();
|
||||
const d = now.getDate();
|
||||
const today = new Date(y, m, d);
|
||||
|
||||
async function main() {
|
||||
const localUsersCount = await User.count({
|
||||
host: null
|
||||
});
|
||||
|
||||
const remoteUsersCount = await User.count({
|
||||
host: { $ne: null }
|
||||
});
|
||||
|
||||
const localNotesCount = await Note.count({
|
||||
'_user.host': null
|
||||
});
|
||||
|
||||
const remoteNotesCount = await Note.count({
|
||||
'_user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': null
|
||||
});
|
||||
|
||||
const remoteDriveFilesCount = await DriveFile.count({
|
||||
'metadata._user.host': { $ne: null }
|
||||
});
|
||||
|
||||
const localDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': null,
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
const remoteDriveFilesSize = await DriveFile
|
||||
.aggregate([{
|
||||
$match: {
|
||||
'metadata._user.host': { $ne: null },
|
||||
'metadata.deletedAt': { $exists: false }
|
||||
}
|
||||
}, {
|
||||
$project: {
|
||||
length: true
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: null,
|
||||
usage: { $sum: '$length' }
|
||||
}
|
||||
}])
|
||||
.then(aggregates => {
|
||||
if (aggregates.length > 0) {
|
||||
return aggregates[0].usage;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
await Chart.insert({
|
||||
date: today,
|
||||
users: {
|
||||
local: {
|
||||
total: localUsersCount,
|
||||
diff: 0
|
||||
},
|
||||
remote: {
|
||||
total: remoteUsersCount,
|
||||
diff: 0
|
||||
}
|
||||
},
|
||||
notes: {
|
||||
local: {
|
||||
total: localNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
},
|
||||
remote: {
|
||||
total: remoteNotesCount,
|
||||
diff: 0,
|
||||
diffs: {
|
||||
normal: 0,
|
||||
reply: 0,
|
||||
renote: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
drive: {
|
||||
local: {
|
||||
totalCount: localDriveFilesCount,
|
||||
totalSize: localDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
},
|
||||
remote: {
|
||||
totalCount: remoteDriveFilesCount,
|
||||
totalSize: remoteDriveFilesSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
console.log('done');
|
||||
}
|
||||
|
||||
main();
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "6.4.1",
|
||||
"version": "7.0.0",
|
||||
"clientVersion": "1.0.8520",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
|
|
|
@ -10,6 +10,9 @@ export interface IChart {
|
|||
|
||||
date: Date;
|
||||
|
||||
/**
|
||||
* ユーザーに関する統計
|
||||
*/
|
||||
users: {
|
||||
local: {
|
||||
/**
|
||||
|
@ -36,6 +39,9 @@ export interface IChart {
|
|||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 投稿に関する統計
|
||||
*/
|
||||
notes: {
|
||||
local: {
|
||||
/**
|
||||
|
@ -95,4 +101,53 @@ export interface IChart {
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* ドライブ(のファイル)に関する統計
|
||||
*/
|
||||
drive: {
|
||||
local: {
|
||||
/**
|
||||
* この日時点での、ローカルのドライブファイル数の総計
|
||||
*/
|
||||
totalCount: number;
|
||||
|
||||
/**
|
||||
* この日時点での、ローカルのドライブファイルサイズの総計
|
||||
*/
|
||||
totalSize: number;
|
||||
|
||||
/**
|
||||
* ローカルのドライブファイル数の前日比
|
||||
*/
|
||||
diffCount: number;
|
||||
|
||||
/**
|
||||
* ローカルのドライブファイルサイズの前日比
|
||||
*/
|
||||
diffSize: number;
|
||||
};
|
||||
|
||||
remote: {
|
||||
/**
|
||||
* この日時点での、リモートのドライブファイル数の総計
|
||||
*/
|
||||
totalCount: number;
|
||||
|
||||
/**
|
||||
* この日時点での、リモートのドライブファイルサイズの総計
|
||||
*/
|
||||
totalSize: number;
|
||||
|
||||
/**
|
||||
* リモートのドライブファイル数の前日比
|
||||
*/
|
||||
diffCount: number;
|
||||
|
||||
/**
|
||||
* リモートのドライブファイルサイズの前日比
|
||||
*/
|
||||
diffSize: number;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -52,6 +52,11 @@ export type IDriveFile = {
|
|||
filename: string;
|
||||
contentType: string;
|
||||
metadata: IMetadata;
|
||||
|
||||
/**
|
||||
* ファイルサイズ
|
||||
*/
|
||||
length: number;
|
||||
};
|
||||
|
||||
export function validateFileName(name: string): boolean {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { INote } from '../models/note';
|
||||
import Chart, { IChart } from '../models/chart';
|
||||
import { isLocalUser, IUser } from '../models/user';
|
||||
import { IDriveFile } from '../models/drive-file';
|
||||
|
||||
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
|
||||
|
||||
|
@ -63,6 +64,20 @@ async function getTodayStats(): Promise<IChart> {
|
|||
renote: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
drive: {
|
||||
local: {
|
||||
totalCount: 0,
|
||||
totalSize: 0,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
},
|
||||
remote: {
|
||||
totalCount: 0,
|
||||
totalSize: 0,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -102,6 +117,20 @@ async function getTodayStats(): Promise<IChart> {
|
|||
renote: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
drive: {
|
||||
local: {
|
||||
totalCount: mostRecentStats.drive.local.totalCount,
|
||||
totalSize: mostRecentStats.drive.local.totalSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
},
|
||||
remote: {
|
||||
totalCount: mostRecentStats.drive.remote.totalCount,
|
||||
totalSize: mostRecentStats.drive.remote.totalSize,
|
||||
diffCount: 0,
|
||||
diffSize: 0
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -127,14 +156,14 @@ async function update(inc: any) {
|
|||
export async function updateUserStats(user: IUser, isAdditional: boolean) {
|
||||
const inc = {} as any;
|
||||
|
||||
const val = isAdditional ? 1 : -1;
|
||||
const amount = isAdditional ? 1 : -1;
|
||||
|
||||
if (isLocalUser(user)) {
|
||||
inc['users.local.total'] = val;
|
||||
inc['users.local.diff'] = val;
|
||||
inc['users.local.total'] = amount;
|
||||
inc['users.local.diff'] = amount;
|
||||
} else {
|
||||
inc['users.remote.total'] = val;
|
||||
inc['users.remote.diff'] = val;
|
||||
inc['users.remote.total'] = amount;
|
||||
inc['users.remote.diff'] = amount;
|
||||
}
|
||||
|
||||
await update(inc);
|
||||
|
@ -143,31 +172,52 @@ export async function updateUserStats(user: IUser, isAdditional: boolean) {
|
|||
export async function updateNoteStats(note: INote, isAdditional: boolean) {
|
||||
const inc = {} as any;
|
||||
|
||||
const val = isAdditional ? 1 : -1;
|
||||
const amount = isAdditional ? 1 : -1;
|
||||
|
||||
if (isLocalUser(note._user)) {
|
||||
inc['notes.local.total'] = val;
|
||||
inc['notes.local.diff'] = val;
|
||||
inc['notes.local.total'] = amount;
|
||||
inc['notes.local.diff'] = amount;
|
||||
|
||||
if (note.replyId != null) {
|
||||
inc['notes.local.diffs.reply'] = val;
|
||||
inc['notes.local.diffs.reply'] = amount;
|
||||
} else if (note.renoteId != null) {
|
||||
inc['notes.local.diffs.renote'] = val;
|
||||
inc['notes.local.diffs.renote'] = amount;
|
||||
} else {
|
||||
inc['notes.local.diffs.normal'] = val;
|
||||
inc['notes.local.diffs.normal'] = amount;
|
||||
}
|
||||
} else {
|
||||
inc['notes.remote.total'] = val;
|
||||
inc['notes.remote.diff'] = val;
|
||||
inc['notes.remote.total'] = amount;
|
||||
inc['notes.remote.diff'] = amount;
|
||||
|
||||
if (note.replyId != null) {
|
||||
inc['notes.remote.diffs.reply'] = val;
|
||||
inc['notes.remote.diffs.reply'] = amount;
|
||||
} else if (note.renoteId != null) {
|
||||
inc['notes.remote.diffs.renote'] = val;
|
||||
inc['notes.remote.diffs.renote'] = amount;
|
||||
} else {
|
||||
inc['notes.remote.diffs.normal'] = val;
|
||||
inc['notes.remote.diffs.normal'] = amount;
|
||||
}
|
||||
}
|
||||
|
||||
await update(inc);
|
||||
}
|
||||
|
||||
export async function updateDriveStats(user: IUser, file: IDriveFile, isAdditional: boolean) {
|
||||
const inc = {} as any;
|
||||
|
||||
const amount = isAdditional ? 1 : -1;
|
||||
const size = isAdditional ? file.length : -file.length;
|
||||
|
||||
if (isLocalUser(user)) {
|
||||
inc['drive.local.totalCount'] = amount;
|
||||
inc['drive.local.diffCount'] = amount;
|
||||
inc['drive.local.totalSize'] = size;
|
||||
inc['drive.local.diffSize'] = size;
|
||||
} else {
|
||||
inc['drive.remote.total'] = amount;
|
||||
inc['drive.remote.diff'] = amount;
|
||||
inc['drive.remote.totalSize'] = size;
|
||||
inc['drive.remote.diffSize'] = size;
|
||||
}
|
||||
|
||||
await update(inc);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue