forked from DebaucheryLibrarian/traxxx
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
exports.up = async function(knex) {
 | 
						|
	// restore avatars in table in case of rollback and rerun
 | 
						|
	const avatars = await knex('actors_avatars')
 | 
						|
		.select('actors_avatars.*', 'actors_profiles.actor_id')
 | 
						|
		.leftJoin('actors_profiles', 'actors_profiles.id', 'actors_avatars.profile_id');
 | 
						|
 | 
						|
	await knex('actors_avatars').delete();
 | 
						|
 | 
						|
	await knex.schema.alterTable('actors_avatars', (table) => {
 | 
						|
		table.integer('profile_id')
 | 
						|
			.nullable()
 | 
						|
			.alter();
 | 
						|
 | 
						|
		table.integer('actor_id')
 | 
						|
			.notNullable()
 | 
						|
			.references('id')
 | 
						|
			.inTable('actors');
 | 
						|
 | 
						|
		table.datetime('created_at')
 | 
						|
			.notNullable()
 | 
						|
			.defaultTo(knex.fn.now());
 | 
						|
 | 
						|
		table.dropUnique('profile_id');
 | 
						|
		table.unique(['profile_id', 'media_id']);
 | 
						|
	});
 | 
						|
 | 
						|
	await knex.schema.alterTable('media', (table) => {
 | 
						|
		// actor avatars often retain the same URL when updated, handle URL-deduping in app code
 | 
						|
		table.dropUnique('source');
 | 
						|
		table.string('source_version'); // usually etag
 | 
						|
	});
 | 
						|
 | 
						|
	await knex.raw('CREATE UNIQUE INDEX unique_main_avatars ON actors_avatars (actor_id) WHERE (profile_id IS NULL);');
 | 
						|
 | 
						|
	if (avatars.length > 0) {
 | 
						|
		await knex('actors_avatars').insert(avatars);
 | 
						|
	}
 | 
						|
 | 
						|
	const profiles = await knex('actors_profiles')
 | 
						|
		.select('id', 'actor_id', 'avatar_media_id')
 | 
						|
		.whereNotNull('avatar_media_id');
 | 
						|
 | 
						|
	await knex('actors_avatars')
 | 
						|
		.insert(profiles.map((profile) => ({
 | 
						|
			actor_id: profile.actor_id,
 | 
						|
			profile_id: profile.id,
 | 
						|
			media_id: profile.avatar_media_id,
 | 
						|
		})))
 | 
						|
		.onConflict()
 | 
						|
		.ignore();
 | 
						|
};
 | 
						|
 | 
						|
exports.down = async function(knex) {
 | 
						|
	// no need to delete all entries, only the ones incompatible with the old scheme
 | 
						|
	await knex('actors_avatars')
 | 
						|
		.whereNull('profile_id')
 | 
						|
		.delete();
 | 
						|
 | 
						|
	await knex.schema.alterTable('actors_avatars', (table) => {
 | 
						|
		table.integer('profile_id')
 | 
						|
			.notNullable()
 | 
						|
			.alter();
 | 
						|
 | 
						|
		table.dropColumn('actor_id');
 | 
						|
		table.dropColumn('created_at');
 | 
						|
 | 
						|
		table.unique('profile_id');
 | 
						|
		table.dropUnique(['profile_id', 'media_id']);
 | 
						|
	});
 | 
						|
 | 
						|
	await knex.schema.alterTable('media', (table) => {
 | 
						|
		table.dropColumn('source_version');
 | 
						|
		table.unique('source');
 | 
						|
	});
 | 
						|
};
 |