Added quick alert migration to repo.
This commit is contained in:
		
							parent
							
								
									0d51e61e46
								
							
						
					
					
						commit
						3855d41e54
					
				|  | @ -0,0 +1,102 @@ | |||
| const config = require('config'); | ||||
| 
 | ||||
| exports.up = async (knex) => { | ||||
| 	await knex.schema.alterTable('alerts', (table) => { | ||||
| 		table.boolean('from_preset') | ||||
| 			.notNullable() | ||||
| 			.defaultTo(false); | ||||
| 
 | ||||
| 		table.text('comment'); | ||||
| 	}); | ||||
| 
 | ||||
| 	await knex.schema.createMaterializedView('alerts_users_actors', (view) => { | ||||
| 		view.columns('user_id', 'actor_id', 'alert_ids'); | ||||
| 
 | ||||
| 		view.as( | ||||
| 			knex('alerts_actors') | ||||
| 				.select( | ||||
| 					'alerts.user_id', | ||||
| 					'alerts_actors.actor_id', | ||||
| 					knex.raw('array_agg(distinct alerts.id) as alert_ids'), | ||||
| 					knex.raw('(alerts_tags.id is null and alerts_entities.id is null and alerts_matches.id is null and related_actors.id is null) as is_only'), | ||||
| 				) | ||||
| 				.leftJoin('alerts', 'alerts.id', 'alerts_actors.alert_id') | ||||
| 				.leftJoin('alerts_entities', 'alerts_entities.alert_id', 'alerts_actors.alert_id') | ||||
| 				.leftJoin('alerts_tags', 'alerts_tags.alert_id', 'alerts_actors.alert_id') | ||||
| 				.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_actors.alert_id') | ||||
| 				.leftJoin('alerts_actors as related_actors', (joinBuilder) => { | ||||
| 					joinBuilder | ||||
| 						.on('related_actors.alert_id', 'alerts_actors.alert_id') | ||||
| 						.on('related_actors.actor_id', '!=', 'alerts_actors.actor_id'); | ||||
| 				}) | ||||
| 				.groupBy(['user_id', 'alerts_actors.actor_id', 'is_only']), | ||||
| 		); | ||||
| 	}); | ||||
| 
 | ||||
| 	await knex.schema.createMaterializedView('alerts_users_tags', (view) => { | ||||
| 		view.columns('user_id', 'tag_id', 'alert_ids'); | ||||
| 
 | ||||
| 		view.as( | ||||
| 			knex('alerts_tags') | ||||
| 				.select( | ||||
| 					'alerts.user_id', | ||||
| 					'alerts_tags.tag_id', | ||||
| 					knex.raw('array_agg(distinct alerts.id) as alert_ids'), | ||||
| 					knex.raw('(alerts_actors.id is null and alerts_entities.id is null and alerts_matches.id is null and related_tags.id is null) as is_only'), | ||||
| 				) | ||||
| 				.leftJoin('alerts', 'alerts.id', 'alerts_tags.alert_id') | ||||
| 				.leftJoin('alerts_entities', 'alerts_entities.alert_id', 'alerts_tags.alert_id') | ||||
| 				.leftJoin('alerts_actors', 'alerts_actors.alert_id', 'alerts_tags.alert_id') | ||||
| 				.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_tags.alert_id') | ||||
| 				.leftJoin('alerts_tags as related_tags', (joinBuilder) => { | ||||
| 					joinBuilder | ||||
| 						.on('related_tags.alert_id', 'alerts_tags.alert_id') | ||||
| 						.on('related_tags.tag_id', '!=', 'alerts_tags.tag_id'); | ||||
| 				}) | ||||
| 				.groupBy(['user_id', 'alerts_tags.tag_id', 'is_only']), | ||||
| 		); | ||||
| 	}); | ||||
| 
 | ||||
| 	await knex.schema.createMaterializedView('alerts_users_entities', (view) => { | ||||
| 		view.columns('user_id', 'entity_id', 'alert_ids'); | ||||
| 
 | ||||
| 		view.as( | ||||
| 			knex('alerts_entities') | ||||
| 				.select( | ||||
| 					'alerts.user_id', | ||||
| 					'alerts_entities.entity_id', | ||||
| 					knex.raw('array_agg(distinct alerts.id) as alert_ids'), | ||||
| 					knex.raw('(alerts_actors.id is null and alerts_tags.id is null and alerts_matches.id is null and related_entities.id is null) as is_only'), | ||||
| 				) | ||||
| 				.leftJoin('alerts', 'alerts.id', 'alerts_entities.alert_id') | ||||
| 				.leftJoin('alerts_tags', 'alerts_tags.alert_id', 'alerts_entities.alert_id') | ||||
| 				.leftJoin('alerts_actors', 'alerts_actors.alert_id', 'alerts_entities.alert_id') | ||||
| 				.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_entities.alert_id') | ||||
| 				.leftJoin('alerts_entities as related_entities', (joinBuilder) => { | ||||
| 					joinBuilder | ||||
| 						.on('related_entities.alert_id', 'alerts_entities.alert_id') | ||||
| 						.on('related_entities.entity_id', '!=', 'alerts_entities.entity_id'); | ||||
| 				}) | ||||
| 				.groupBy(['user_id', 'alerts_entities.entity_id', 'is_only']), | ||||
| 		); | ||||
| 	}); | ||||
| 
 | ||||
| 	await knex.raw(` | ||||
| 		GRANT SELECT ON alerts_users_actors TO :visitor; | ||||
| 		GRANT SELECT ON alerts_users_entities TO :visitor; | ||||
| 		GRANT SELECT ON alerts_users_tags TO :visitor; | ||||
| 	`, {
 | ||||
| 		visitor: knex.raw(config.database.query.user), | ||||
| 	}); | ||||
| }; | ||||
| 
 | ||||
| exports.down = async (knex) => { | ||||
| 	await knex.schema.alterTable('alerts', (table) => { | ||||
| 		table.dropColumn('from_preset'); | ||||
| 		table.dropColumn('comment'); | ||||
| 	}); | ||||
| 
 | ||||
| 	await knex.schema.dropMaterializedView('alerts_users_actors'); | ||||
| 	await knex.schema.dropMaterializedView('alerts_users_tags'); | ||||
| 	await knex.schema.dropMaterializedView('alerts_users_entities'); | ||||
| }; | ||||
		Loading…
	
		Reference in New Issue