[AB-103] adding triggers to update created and updating attributes on tables

fixing error handling in installer
merging change sets to larger operations
adding check constraints
fixing suggestion id handling
applying naming conventions to various columns
adding indices to tables
adding user in server and user locking
This commit is contained in:
Sheldan
2021-02-07 03:06:48 +01:00
parent dac3b0887f
commit 038d5c3832
126 changed files with 1416 additions and 986 deletions

View File

@@ -6,26 +6,42 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="modmail_message-table">
<createTable tableName="modmail_message">
<column name="message_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="modmail_message_pkey"/>
<changeSet author="Sheldan" id="mod_mail_message-table">
<createTable tableName="mod_mail_message">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="mod_mail_message_pkey"/>
</column>
<column name="anonymous" type="BOOLEAN"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="dm_channel" type="BOOLEAN"/>
<column name="modmail_message_author" type="BIGINT">
<column name="created_message_in_dm" type="BIGINT" />
<column name="created_message_in_channel" type="BIGINT" />
<column name="anonymous" type="BOOLEAN">
<constraints nullable="true"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="dm_channel" type="BOOLEAN">
<constraints nullable="true"/>
</column>
<column name="author_user_in_server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="thread_reference" type="BIGINT">
<column name="thread_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="modmail_message-fk_modmail_message_thread">
<addForeignKeyConstraint baseColumnNames="thread_reference" baseTableName="modmail_message" constraintName="fk_modmail_message_thread" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="modmail_thread" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="modmail_message-fk_modmail_message_author">
<addForeignKeyConstraint baseColumnNames="modmail_message_author" baseTableName="modmail_message" constraintName="fk_modmail_message_author" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<createIndex indexName="idx_mod_mail_message_thread" tableName="mod_mail_message">
<column name="thread_id"/>
</createIndex>
<addForeignKeyConstraint baseColumnNames="thread_id" baseTableName="mod_mail_message" constraintName="fk_mod_mail_message_thread" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="mod_mail_thread" validate="true"/>
<addForeignKeyConstraint baseColumnNames="author_user_in_server_id" baseTableName="mod_mail_message" constraintName="fk_mod_mail_message_author" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS mod_mail_message_update_trigger ON mod_mail_message;
CREATE TRIGGER mod_mail_message_update_trigger BEFORE UPDATE ON mod_mail_message FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS mod_mail_message_insert_trigger ON mod_mail_message;
CREATE TRIGGER mod_mail_message_insert_trigger BEFORE INSERT ON mod_mail_message FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -6,25 +6,32 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="modmail_role-table">
<createTable tableName="modmail_role">
<column autoIncrement="true" name="mod_mail_role_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="modmail_role_pkey"/>
<changeSet author="Sheldan" id="mod_mail_role-table">
<createTable tableName="mod_mail_role">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="mod_mail_role_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="modmail_role" type="BIGINT">
<column name="role_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="modmail_role_server" type="BIGINT">
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="mod_mail_role" constraintName="fk_mod_mail_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="mod_mail_role" constraintName="fk_mod_mail_role_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS mod_mail_role_update_trigger ON mod_mail_role;
CREATE TRIGGER mod_mail_role_update_trigger BEFORE UPDATE ON mod_mail_role FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS mod_mail_role_insert_trigger ON mod_mail_role;
CREATE TRIGGER mod_mail_role_insert_trigger BEFORE INSERT ON mod_mail_role FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
<changeSet author="Sheldan" id="modmail_role-fk_modmail_role_role">
<addForeignKeyConstraint baseColumnNames="modmail_role" baseTableName="modmail_role" constraintName="fk_modmail_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="modmail_role-fk_modmail_role_server">
<addForeignKeyConstraint baseColumnNames="modmail_role_server" baseTableName="modmail_role" constraintName="fk_modmail_role_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -6,26 +6,32 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="modmail_subscriber-table">
<createTable tableName="modmail_subscriber">
<column autoIncrement="true" name="subscriber_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="modmail_subscriber_pkey"/>
<changeSet author="Sheldan" id="mod_mail_subscriber-table">
<createTable tableName="mod_mail_subscriber">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="mod_mail_subscriber_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="modmail_thread_subscriber" type="BIGINT">
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="user_in_server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="mod_mail_thread" type="BIGINT">
<column name="mod_mail_thread_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="modmail_subscriber-fk_modmail_thread_subscriber_user">
<addForeignKeyConstraint baseColumnNames="modmail_thread_subscriber" baseTableName="modmail_subscriber" constraintName="fk_modmail_thread_subscriber_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="modmail_subscriber-fk_modmail_thread_thread">
<addForeignKeyConstraint baseColumnNames="mod_mail_thread" baseTableName="modmail_subscriber" constraintName="fk_modmail_thread_thread" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="modmail_thread" validate="true"/>
<addForeignKeyConstraint baseColumnNames="user_in_server_id" baseTableName="mod_mail_subscriber" constraintName="fk_mod_mail_thread_subscriber_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<addForeignKeyConstraint baseColumnNames="mod_mail_thread_id" baseTableName="mod_mail_subscriber" constraintName="fk_mod_mail_thread_thread" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="mod_mail_thread" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS mod_mail_subscriber_update_trigger ON mod_mail_subscriber;
CREATE TRIGGER mod_mail_subscriber_update_trigger BEFORE UPDATE ON mod_mail_subscriber FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS mod_mail_subscriber_insert_trigger ON mod_mail_subscriber;
CREATE TRIGGER mod_mail_subscriber_insert_trigger BEFORE INSERT ON mod_mail_subscriber FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -6,33 +6,51 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="modmail_thread-table">
<createTable tableName="modmail_thread">
<changeSet author="Sheldan" id="mod_mail_thread-table">
<createTable tableName="mod_mail_thread">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="modmail_thread_pkey"/>
<constraints nullable="false" primaryKey="true" primaryKeyName="mod_mail_thread_pkey"/>
</column>
<column name="closed" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="closed" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="state" type="VARCHAR(255)"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="modmail_thread_channel" type="BIGINT">
<column name="state" type="VARCHAR(255)">
<constraints nullable="true"/>
</column>
<column name="channel_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="modmail_thread_server" type="BIGINT">
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="modmail_user" type="BIGINT">
<column name="user_in_server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="modmail_thread-fk_modmail_thread_channel">
<addForeignKeyConstraint baseColumnNames="modmail_thread_channel" baseTableName="modmail_thread" constraintName="fk_modmail_thread_channel" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="channel" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="modmail_thread-fk_modmail_thread_user">
<addForeignKeyConstraint baseColumnNames="modmail_user" baseTableName="modmail_thread" constraintName="fk_modmail_thread_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="modmail_thread-fk_modmail_thread_server">
<addForeignKeyConstraint baseColumnNames="modmail_thread_server" baseTableName="modmail_thread" constraintName="fk_modmail_thread_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
<createIndex indexName="idx_mod_mail_thread_user" tableName="mod_mail_thread">
<column name="user_in_server_id"/>
</createIndex>
<createIndex indexName="idx_mod_mail_thread_channel" tableName="mod_mail_thread">
<column name="channel_id"/>
</createIndex>
<createIndex indexName="idx_mod_mail_thread_user_state" tableName="mod_mail_thread">
<column name="user_in_server_id"/>
<column name="state"/>
</createIndex>
<addForeignKeyConstraint baseColumnNames="channel_id" baseTableName="mod_mail_thread" constraintName="fk_mod_mail_thread_channel" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="channel" validate="true"/>
<addForeignKeyConstraint baseColumnNames="user_in_server_id" baseTableName="mod_mail_thread" constraintName="fk_mod_mail_thread_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="mod_mail_thread" constraintName="fk_mod_mail_thread_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS mod_mail_thread_update_trigger ON mod_mail_thread;
CREATE TRIGGER mod_mail_thread_update_trigger BEFORE UPDATE ON mod_mail_thread FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS mod_mail_thread_insert_trigger ON mod_mail_thread;
CREATE TRIGGER mod_mail_thread_insert_trigger BEFORE INSERT ON mod_mail_thread FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -17,7 +17,7 @@ import java.time.Instant;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_message")
@Table(name = "mod_mail_message")
@Getter
@Setter
@EqualsAndHashCode
@@ -29,6 +29,7 @@ public class ModMailMessage implements Serializable {
* The ID of the message which caused this message to be created, either the message containing the command or the message received from the user
*/
@Id
@Column(name = "id")
private Long messageId;
/**
@@ -38,41 +39,39 @@ public class ModMailMessage implements Serializable {
*/
@Column(name = "created_message_in_dm")
private Long createdMessageInDM;
@Column
@Column(name = "created_message_in_channel")
private Long createdMessageInChannel;
/**
* The {@link AUserInAServer} which authored this message
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_message_author", nullable = false)
@JoinColumn(name = "author_user_in_server_id", nullable = false)
private AUserInAServer author;
/**
* The {@link ModMailThread} in whose context this message was sent and this message is related to
*/
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "threadReference", nullable = false)
@JoinColumn(name = "thread_id", nullable = false)
private ModMailThread threadReference;
/**
* true: message was send via command, false: message was send from the user
* This is used to decide where to get the message from in case of logging, because the user might delete the message and we do not want to re-parse the command message
*/
@Column
@Column(name = "dm_channel")
private Boolean dmChannel;
/**
* Staff only: Whether or not this message meant to be sent anonymous
*/
@Column
@Column(name = "anonymous")
private Boolean anonymous;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
}

View File

@@ -17,7 +17,7 @@ import java.time.Instant;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_role")
@Table(name = "mod_mail_role")
@Getter
@Setter
@EqualsAndHashCode
@@ -29,6 +29,7 @@ public class ModMailRole implements Serializable {
* Unique ID of the mod mail role
*/
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long modMailRoleId;
@@ -36,29 +37,20 @@ public class ModMailRole implements Serializable {
* Which {@link AServer} this role is associated with, for convenience
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_role_server", nullable = false)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
/**
* The actual {@link ARole} which this mod mail role references
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_role", nullable = false)
@JoinColumn(name = "role_id", nullable = false)
private ARole role;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
@PreUpdate
private void onUpdate() {
this.updated = Instant.now();
}
}

View File

@@ -20,7 +20,7 @@ import java.util.List;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_thread")
@Table(name = "mod_mail_thread")
@Getter
@Setter
@EqualsAndHashCode
@@ -30,46 +30,37 @@ public class ModMailThread implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/**
* The member who opened the thread or who got contacted
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_user", nullable = false)
@JoinColumn(name = "user_in_server_id", nullable = false)
private AUserInAServer user;
/**
* The text channel in which this thread is dealt with
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_thread_channel", nullable = false)
@JoinColumn(name = "channel_id", nullable = false)
private AChannel channel;
/**
* The server on which this mod mail thread is, for convenience
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_thread_server", nullable = false)
@JoinColumn(name = "server_id", nullable = false)
private AServer server;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
@PreUpdate
private void onUpdate() {
this.updated = Instant.now();
}
@Column
@Column(name = "closed")
private Instant closed;
/**
@@ -101,7 +92,7 @@ public class ModMailThread implements Serializable {
* The current state of the mod mail thread. Whether or not the last post was by staff or user.
*/
@Enumerated(EnumType.STRING)
@Column
@Column(name = "state")
private ModMailThreadState state;
}

View File

@@ -15,7 +15,7 @@ import java.time.Instant;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_subscriber")
@Table(name = "mod_mail_subscriber")
@Getter
@Setter
@EqualsAndHashCode
@@ -25,28 +25,27 @@ public class ModMailThreadSubscriber {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long subscriberId;
/**
* The staff member which is subscribed
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_thread_subscriber", nullable = false)
@JoinColumn(name = "user_in_server_id", nullable = false)
private AUserInAServer subscriber;
/**
* The thread for which the member is subscribed to
*/
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "modMailThread", nullable = false)
@JoinColumn(name = "mod_mail_thread_id", nullable = false)
private ModMailThread threadReference;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updated;
}