Chart resyncing (#5372)
* wip * Add test * Fix test * Insert moderation log * Add todo
This commit is contained in:
		
							parent
							
								
									84730a071a
								
							
						
					
					
						commit
						96b2267cb8
					
				
					 4 changed files with 97 additions and 2 deletions
				
			
		
							
								
								
									
										21
									
								
								src/server/api/endpoints/admin/resync-chart.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/server/api/endpoints/admin/resync-chart.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| import define from '../../define'; | ||||
| import { driveChart, notesChart, usersChart, instanceChart } from '../../../../services/chart'; | ||||
| import { insertModerationLog } from '../../../../services/insert-moderation-log'; | ||||
| 
 | ||||
| export const meta = { | ||||
| 	tags: ['admin'], | ||||
| 
 | ||||
| 	requireCredential: true, | ||||
| 	requireModerator: true, | ||||
| }; | ||||
| 
 | ||||
| export default define(meta, async (ps, me) => { | ||||
| 	insertModerationLog(me, 'chartResync'); | ||||
| 
 | ||||
| 	driveChart.resync(); | ||||
| 	notesChart.resync(); | ||||
| 	usersChart.resync(); | ||||
| 	instanceChart.resync(); | ||||
| 
 | ||||
| 	// TODO: ユーザーごとのチャートもキューに入れて更新する
 | ||||
| }); | ||||
|  | @ -6,7 +6,7 @@ import { name, schema } from '../schemas/test'; | |||
| type TestLog = SchemaType<typeof schema>; | ||||
| 
 | ||||
| export default class TestChart extends Chart<TestLog> { | ||||
| 	private total = 0; | ||||
| 	public total = 0; // publicにするのはテストのため
 | ||||
| 
 | ||||
| 	constructor() { | ||||
| 		super(name, schema); | ||||
|  |  | |||
|  | @ -65,7 +65,7 @@ export default abstract class Chart<T extends Record<string, any>> { | |||
| 	public schema: Schema; | ||||
| 	protected repository: Repository<Log>; | ||||
| 	protected abstract genNewLog(latest: T): DeepPartial<T>; | ||||
| 	protected abstract async fetchActual(group?: string): Promise<DeepPartial<T>>; | ||||
| 	protected abstract async fetchActual(group: string | null): Promise<DeepPartial<T>>; | ||||
| 
 | ||||
| 	@autobind | ||||
| 	private static convertSchemaToFlatColumnDefinitions(schema: Schema) { | ||||
|  | @ -341,6 +341,24 @@ export default abstract class Chart<T extends Record<string, any>> { | |||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	@autobind | ||||
| 	public async resync(group: string | null = null): Promise<any> { | ||||
| 		const data = await this.fetchActual(group); | ||||
| 
 | ||||
| 		const update = async (log: Log) => { | ||||
| 			await this.repository.createQueryBuilder() | ||||
| 				.update() | ||||
| 				.set(Chart.convertObjectToFlattenColumns(data)) | ||||
| 				.where('id = :id', { id: log.id }) | ||||
| 				.execute(); | ||||
| 		}; | ||||
| 
 | ||||
| 		return Promise.all([ | ||||
| 			this.getCurrentLog('day', group).then(log => update(log)), | ||||
| 			this.getCurrentLog('hour', group).then(log => update(log)), | ||||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	@autobind | ||||
| 	protected async inc(inc: DeepPartial<T>, group: string | null = null): Promise<void> { | ||||
| 		await this.commit(Chart.convertQuery(inc as any), group); | ||||
|  |  | |||
|  | @ -320,4 +320,60 @@ describe('Chart', () => { | |||
| 			}); | ||||
| 		})); | ||||
| 	}); | ||||
| 
 | ||||
| 	describe('Resync', () => { | ||||
| 		it('Can resync', async(async () => { | ||||
| 			testChart.total = 1; | ||||
| 
 | ||||
| 			await testChart.resync(); | ||||
| 
 | ||||
| 			const chartHours = await testChart.getChart('hour', 3); | ||||
| 			const chartDays = await testChart.getChart('day', 3); | ||||
| 
 | ||||
| 			assert.deepStrictEqual(chartHours, { | ||||
| 				foo: { | ||||
| 					dec: [0, 0, 0], | ||||
| 					inc: [0, 0, 0], | ||||
| 					total: [1, 0, 0] | ||||
| 				}, | ||||
| 			}); | ||||
| 
 | ||||
| 			assert.deepStrictEqual(chartDays, { | ||||
| 				foo: { | ||||
| 					dec: [0, 0, 0], | ||||
| 					inc: [0, 0, 0], | ||||
| 					total: [1, 0, 0] | ||||
| 				}, | ||||
| 			}); | ||||
| 		})); | ||||
| 
 | ||||
| 		it('Can resync (2)', async(async () => { | ||||
| 			await testChart.increment(); | ||||
| 
 | ||||
| 			clock.tick('01:00:00'); | ||||
| 
 | ||||
| 			testChart.total = 100; | ||||
| 
 | ||||
| 			await testChart.resync(); | ||||
| 
 | ||||
| 			const chartHours = await testChart.getChart('hour', 3); | ||||
| 			const chartDays = await testChart.getChart('day', 3); | ||||
| 
 | ||||
| 			assert.deepStrictEqual(chartHours, { | ||||
| 				foo: { | ||||
| 					dec: [0, 0, 0], | ||||
| 					inc: [0, 1, 0], | ||||
| 					total: [100, 1, 0] | ||||
| 				}, | ||||
| 			}); | ||||
| 
 | ||||
| 			assert.deepStrictEqual(chartDays, { | ||||
| 				foo: { | ||||
| 					dec: [0, 0, 0], | ||||
| 					inc: [1, 0, 0], | ||||
| 					total: [100, 0, 0] | ||||
| 				}, | ||||
| 			}); | ||||
| 		})); | ||||
| 	}); | ||||
| }); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue