[AB-161] fixed composite foreign keys for multiple tables

This commit is contained in:
Sheldan
2020-11-22 18:38:51 +01:00
parent 1d9f2595db
commit b05a834b59
12 changed files with 36 additions and 60 deletions

View File

@@ -8,9 +8,7 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="mute-table">
<createTable tableName="mute">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="mute_pkey"/>
</column>
<column name="id" type="BIGINT" />
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="reason" type="VARCHAR(255)"/>
<column name="trigger_key" type="VARCHAR(255)"/>
@@ -32,6 +30,7 @@
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="server_id, id" tableName="mute" constraintName="pk_mute" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="mute-fk_mute_channel">

View File

@@ -8,9 +8,7 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="user_note-table">
<createTable tableName="user_note">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="user_note_pkey"/>
</column>
<column autoIncrement="true" name="id" type="BIGINT" />
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="note" type="VARCHAR(2000)"/>
<column name="note_user" type="BIGINT">
@@ -20,6 +18,7 @@
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="server_id, id" tableName="user_note" constraintName="pk_user_note" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="user_note-fk_user_note_user">

View File

@@ -8,9 +8,7 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="warning-table">
<createTable tableName="warning">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="warning_pkey"/>
</column>
<column autoIncrement="true" name="id" type="BIGINT" />
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="decay_date" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="decayed" type="BOOLEAN"/>
@@ -27,9 +25,9 @@
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="server_id, id" tableName="warning" constraintName="pk_warning" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="warning-fk_warning_warned_user">
<addForeignKeyConstraint baseColumnNames="warned_user_id" baseTableName="warning" constraintName="fk_warning_warned_user" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="user_in_server_id" referencedTableName="user_in_server" validate="true"/>
</changeSet>

View File

@@ -8,9 +8,7 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="tracked_emote-table">
<createTable tableName="tracked_emote">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="tracked_emote_pkey"/>
</column>
<column name="id" type="BIGINT" />
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="name" type="VARCHAR(32)"/>
@@ -23,6 +21,7 @@
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="server_id, id" tableName="tracked_emote" constraintName="pk_tracked_emote" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="tracked_emote-fk_tracked_emote_server">
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="tracked_emote" constraintName="fk_tracked_emote_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>

View File

@@ -8,22 +8,17 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="used_emote-table">
<createTable tableName="used_emote">
<column name="emote_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="used_emote_pkey"/>
</column>
<column name="server_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="used_emote_pkey"/>
</column>
<column name="use_date" type="DATE">
<constraints nullable="false" primaryKey="true" primaryKeyName="used_emote_pkey"/>
</column>
<column name="emote_id" type="BIGINT" />
<column name="server_id" type="BIGINT" />
<column name="use_date" type="DATE" />
<column name="amount" type="BIGINT"/>
</createTable>
<addPrimaryKey columnNames="server_id, emote_id, use_date" tableName="used_emote" constraintName="pk_used_emote" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="used_emote-fk_used_emote_server">
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="used_emote" constraintName="fk_used_emote_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="used_emote-fk_used_emote_tracked_emote">
<addForeignKeyConstraint baseColumnNames="emote_id" baseTableName="used_emote" constraintName="fk_used_emote_tracked_emote" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="tracked_emote" validate="true"/>
<addForeignKeyConstraint baseColumnNames="emote_id, server_id" baseTableName="used_emote" constraintName="fk_used_emote_tracked_emote" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id, server_id" referencedTableName="tracked_emote" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -103,7 +103,7 @@ public class SuggestionServiceBean implements SuggestionService {
Long channelId = suggestion.getChannel().getId();
Long originalMessageId = suggestion.getMessageId();
Long serverId = suggestion.getServer().getId();
log.info("Updated posted suggestion {} in server {}.", suggestion.getId(), suggestion.getServer().getId());
log.info("Updated posted suggestion {} in server {}.", suggestion.getSuggestionId().getId(), suggestion.getServer().getId());
suggestionLog.setOriginalChannelId(channelId);
suggestionLog.setOriginalMessageId(originalMessageId);
@@ -112,7 +112,7 @@ public class SuggestionServiceBean implements SuggestionService {
TextChannel textChannelById = botService.getTextChannelFromServer(serverId, channelId);
CompletableFuture<Member> memberById = botService.getMemberInServerAsync(serverId, suggester.getUserReference().getId());
suggestionLog.setState(suggestion.getState());
suggestionLog.setSuggestionId(suggestion.getId());
suggestionLog.setSuggestionId(suggestion.getSuggestionId().getId());
CompletableFuture<Void> finalFuture = new CompletableFuture<>();
memberById.whenComplete((member, throwable) -> {
if(throwable == null) {

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.utility.service.management;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
@@ -47,7 +48,7 @@ public class SuggestionManagementServiceBean implements SuggestionManagementServ
.builder()
.state(SuggestionState.NEW)
.suggester(suggester)
.id(suggestionId)
.suggestionId(new ServerSpecificId(suggester.getServerReference().getId(), suggestionId))
.server(suggester.getServerReference())
.suggestionDate(Instant.now())
.channel(channel)
@@ -68,7 +69,7 @@ public class SuggestionManagementServiceBean implements SuggestionManagementServ
@Override
public void setSuggestionState(Suggestion suggestion, SuggestionState newState) {
suggestion.setState(newState);
log.info("Setting suggestion {} to state {}.", suggestion.getId(), newState);
log.info("Setting suggestion {} in server {} to state {}.", suggestion.getSuggestionId().getId(), suggestion.getSuggestionId().getServerId(), newState);
suggestionRepository.save(suggestion);
}
}

View File

@@ -8,9 +8,7 @@
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="suggestion-table">
<createTable tableName="suggestion">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="suggestion_pkey"/>
</column>
<column autoIncrement="true" name="id" type="BIGINT"/>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="message_id" type="BIGINT"/>
<column name="state" type="VARCHAR(255)"/>
@@ -22,6 +20,7 @@
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="server_id, id" tableName="suggestion" constraintName="pk_suggestion" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="suggestion-fk_suggestion_channel">
<addForeignKeyConstraint baseColumnNames="channel_id" baseTableName="suggestion" constraintName="fk_suggestion_channel" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="channel" validate="true"/>

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.utility.service;
import dev.sheldan.abstracto.core.exception.ChannelNotFoundException;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
@@ -150,7 +151,7 @@ public class SuggestionServiceBeanTest {
.builder()
.channel(channel)
.server(server)
.id(SUGGESTION_ID)
.suggestionId(new ServerSpecificId(server.getId(), SUGGESTION_ID))
.suggester(suggester)
.messageId(messageId)
.build();
@@ -235,7 +236,7 @@ public class SuggestionServiceBeanTest {
.builder()
.channel(channel)
.server(server)
.id(SUGGESTION_ID)
.suggestionId(new ServerSpecificId(server.getId(), SUGGESTION_ID))
.suggester(suggester)
.messageId(messageId)
.build();

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.utility.service.management;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
@@ -89,11 +90,11 @@ public class SuggestionManagementServiceBeanTest {
@Test
public void testGetSuggestion() {
Long suggestionId = 5L;
Suggestion foundSuggestion = Suggestion.builder().id(suggestionId).build();
Suggestion foundSuggestion = Suggestion.builder().suggestionId(new ServerSpecificId(0L, suggestionId)).build();
when(suggestionRepository.findById(suggestionId)).thenReturn(Optional.of(foundSuggestion));
Optional<Suggestion> suggestionOptional = testUnit.getSuggestion(suggestionId);
Assert.assertTrue(suggestionOptional.isPresent());
suggestionOptional.ifPresent(suggestion -> Assert.assertEquals(suggestionId, suggestion.getId()));
suggestionOptional.ifPresent(suggestion -> Assert.assertEquals(suggestionId, suggestion.getSuggestionId().getId()));
}
@Test
@@ -107,7 +108,7 @@ public class SuggestionManagementServiceBeanTest {
@Test
public void setSuggestionState() {
Suggestion suggestion = Suggestion.builder().build();
Suggestion suggestion = Suggestion.builder().suggestionId(new ServerSpecificId(0L, 4L)).build();
testUnit.setSuggestionState(suggestion, SuggestionState.ACCEPTED);
Assert.assertEquals(suggestion.getState(), SuggestionState.ACCEPTED);
verify(suggestionRepository, times(1)).save(suggestion);

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.utility.models.database;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
@@ -10,7 +11,6 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
import java.util.Objects;
@Entity
@Table(name="suggestion")
@@ -25,9 +25,9 @@ import java.util.Objects;
public class Suggestion implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
private Long id;
@EmbeddedId
private ServerSpecificId suggestionId;
@Getter
@ManyToOne
@@ -43,9 +43,9 @@ public class Suggestion implements Serializable {
@JoinColumn(name = "channelId")
private AChannel channel;
@Getter
@ManyToOne
@JoinColumn(name = "serverId")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@MapsId("serverId")
@JoinColumn(name = "server_id", referencedColumnName = "id", nullable = false)
private AServer server;
@Getter
@@ -71,22 +71,4 @@ public class Suggestion implements Serializable {
this.updated = Instant.now();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Suggestion that = (Suggestion) o;
return Objects.equals(id, that.id) &&
Objects.equals(suggester, that.suggester) &&
Objects.equals(messageId, that.messageId) &&
Objects.equals(channel, that.channel) &&
Objects.equals(server, that.server) &&
Objects.equals(suggestionDate, that.suggestionDate) &&
state == that.state;
}
@Override
public int hashCode() {
return Objects.hash(id, suggester, messageId, channel, server, suggestionDate, state);
}
}

View File

@@ -6,6 +6,7 @@ import lombok.Setter;
import net.dv8tion.jda.api.entities.MessageEmbed;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
@@ -18,7 +19,8 @@ public class MessageToSend {
/**
* The collections of embeds to be send. The first embed is in the same message as the string message.
*/
private List<MessageEmbed> embeds;
@Builder.Default
private List<MessageEmbed> embeds = new ArrayList<>();
/**
* The string content to be used in the first message.
*/