[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

@@ -50,8 +50,8 @@ public interface UserExperienceRepository extends JpaRepository<AUserExperience
*/
@Query(value = "WITH user_experience_ranked AS" +
"( " +
" SELECT us.id, us.experience, us.experience_role_id, us.level_id, us.message_count, ROW_NUMBER() OVER ( ORDER BY experience DESC ) " +
" FROM user_experience us INNER JOIN user_in_server uis ON us.id = uis.user_in_server_id INNER JOIN server s ON s.id = uis.server_reference WHERE s.id = :serverId" +
" SELECT us.id, us.experience, us.role_id, us.level_id, us.message_count, ROW_NUMBER() OVER ( ORDER BY experience DESC ) " +
" FROM user_experience us INNER JOIN user_in_server uis ON us.id = uis.user_in_server_id INNER JOIN server s ON s.id = uis.server_id WHERE s.id = :serverId" +
") " +
"SELECT rank.id as \"id\", rank.experience as \"experience\", rank.message_count as \"messageCount\", rank.level_id as \"level\", rank.row_number as \"rank\" " +
"FROM user_experience_ranked rank " +

View File

@@ -91,6 +91,7 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
} else {
experienceRole = AExperienceRole
.builder()
.id(role.getId())
.level(level)
.roleServer(role.getServer())
.role(role)

View File

@@ -6,19 +6,25 @@
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="disabled_experience_roles-table">
<createTable tableName="disabled_experience_roles">
<changeSet author="Sheldan" id="disabled_experience_role-table">
<createTable tableName="disabled_experience_role">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="disabled_experience_roles_pkey"/>
<constraints nullable="false" primaryKey="true" primaryKeyName="disabled_experience_role_pkey"/>
</column>
<column name="role_id" type="BIGINT">
<constraints nullable="false"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="disabled_experience_roles-fk_disabled_experience_role_role">
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="disabled_experience_roles" constraintName="fk_disabled_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
<addForeignKeyConstraint baseColumnNames="id" baseTableName="disabled_experience_role" constraintName="fk_disabled_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS disabled_experience_role_update_trigger ON disabled_experience_role;
CREATE TRIGGER disabled_experience_role_update_trigger BEFORE UPDATE ON disabled_experience_role FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS disabled_experience_role_insert_trigger ON disabled_experience_role;
CREATE TRIGGER disabled_experience_role_insert_trigger BEFORE INSERT ON disabled_experience_role FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -11,9 +11,22 @@
<column name="level" type="INTEGER">
<constraints nullable="false" primaryKey="true" primaryKeyName="experience_level_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience_needed" type="BIGINT"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience_needed" type="BIGINT">
<constraints nullable="true"/>
</column>
</createTable>
<sql>
DROP TRIGGER IF EXISTS experience_level_update_trigger ON experience_level;
CREATE TRIGGER experience_level_update_trigger BEFORE UPDATE ON experience_level FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS experience_level_insert_trigger ON experience_level;
CREATE TRIGGER experience_level_insert_trigger BEFORE INSERT ON experience_level FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -8,30 +8,30 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="experience_role-table">
<createTable tableName="experience_role">
<column autoIncrement="true" name="id" type="BIGINT">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="experience_role_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
<constraints nullable="true"/>
</column>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="level_id" type="INTEGER">
<constraints nullable="false"/>
</column>
<column name="role_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_level">
<addForeignKeyConstraint baseColumnNames="level_id" baseTableName="experience_role" constraintName="fk_experience_role_level" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="level" referencedTableName="experience_level" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_role">
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="experience_role" constraintName="fk_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_server">
<addForeignKeyConstraint baseColumnNames="id" baseTableName="experience_role" constraintName="fk_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="experience_role" constraintName="fk_experience_role_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS experience_role_update_trigger ON experience_role;
CREATE TRIGGER experience_role_update_trigger BEFORE UPDATE ON experience_role FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS experience_role_insert_trigger ON experience_role;
CREATE TRIGGER experience_role_insert_trigger BEFORE INSERT ON experience_role FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
</databaseChangeLog>

View File

@@ -11,22 +11,34 @@
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="user_experience_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience" type="BIGINT"/>
<column name="experience_gain_disabled" type="BOOLEAN"/>
<column name="message_count" type="BIGINT"/>
<column name="experience" type="BIGINT">
<constraints nullable="true"/>
</column>
<column name="experience_gain_disabled" type="BOOLEAN">
<constraints nullable="true"/>
</column>
<column name="message_count" type="BIGINT">
<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="experience_role_id" type="BIGINT"/>
<column name="role_id" type="BIGINT"/>
<column name="level_id" type="INTEGER">
<constraints nullable="false"/>
</column>
</createTable>
<addForeignKeyConstraint baseColumnNames="level_id" baseTableName="user_experience" constraintName="fk_user_experience_level" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="level" referencedTableName="experience_level" validate="true"/>
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="user_experience" constraintName="fk_user_experience_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="experience_role" validate="true"/>
<sql>
DROP TRIGGER IF EXISTS user_experience_update_trigger ON user_experience;
CREATE TRIGGER user_experience_update_trigger BEFORE UPDATE ON user_experience FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
</sql>
<sql>
DROP TRIGGER IF EXISTS user_experience_insert_trigger ON user_experience;
CREATE TRIGGER user_experience_insert_trigger BEFORE INSERT ON user_experience FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
</sql>
</changeSet>
<changeSet author="Sheldan" id="user_experience-fk_user_experience_level">
<addForeignKeyConstraint baseColumnNames="level_id" baseTableName="user_experience" constraintName="fk_user_experience_level" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="level" referencedTableName="experience_level" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="user_experience-fk_user_experience_role">
<addForeignKeyConstraint baseColumnNames="experience_role_id" baseTableName="user_experience" constraintName="fk_user_experience_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="experience_role" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -6,6 +6,7 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
/**
* A role for which the experience gain in a particular server has been disabled.
@@ -14,21 +15,28 @@ import java.io.Serializable;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "disabled_experience_roles")
@Table(name = "disabled_experience_role")
@Getter
@Setter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ADisabledExpRole implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private ARole role;
/**
* Reference to the actual {@link ARole} being marked as disabled for experience gain.
*/
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", nullable = false)
private ARole role;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -25,26 +25,18 @@ public class AExperienceLevel implements Serializable {
* The unique level from 0 to as defined in the configuration. Will be created on startup.
*/
@Id
@Column(name = "level")
private Integer level;
/**
* The total amount of experience needed for this level.
*/
@Column(name = "experience_needed")
private Long experienceNeeded;
@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

@@ -31,9 +31,13 @@ public class AExperienceRole implements Serializable {
* The abstracto unique id of this experience role.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn
private ARole role;
/**
* Reference to the {@link AExperienceLevel} at which this role is awarded.
*/
@@ -50,29 +54,12 @@ public class AExperienceRole implements Serializable {
@JoinColumn(name = "server_id", nullable = false)
private AServer roleServer;
/**
* Reference to the actual {@link ARole} being awarded.
*/
@OneToOne(fetch = FetchType.LAZY)
@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();
}
/**
* Current list of {@link dev.sheldan.abstracto.core.models.database.AUserInAServer} which were given this role.
*/

View File

@@ -29,6 +29,7 @@ public class AUserExperience implements Serializable {
* The {@link AUserInAServer} id which is unique for each user in a server.
*/
@Id
@Column(name = "id")
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@@ -38,16 +39,19 @@ public class AUserExperience implements Serializable {
/**
* The total amount of experience the user has in the guild
*/
@Column(name = "experience")
private Long experience;
/**
* The total amount of messages the user has written in the guild resulting in the experience.
*/
@Column(name = "message_count")
private Long messageCount;
/**
* Whether or not the experience gain has been disabled for this user
*/
@Column(name = "experience_gain_disabled")
private Boolean experienceGainDisabled;
/**
@@ -61,25 +65,15 @@ public class AUserExperience implements Serializable {
* The {@link AExperienceRole} the user currently has. Can be null.
*/
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "experience_role_id")
@JoinColumn(name = "role_id")
private AExperienceRole currentExperienceRole;
@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();
}
public Integer getLevelOrDefault() {
return currentLevel != null ? currentLevel.getLevel() : 0;
}