Skip to content

Commit ffb2f7e

Browse files
authored
refactor: add datetime to chat and subscriptions tables (#152)
* chore: added migrations for date_time * refactor: added timestamps for chats * test: updated tests * chore: fixed flyway applied test migrations * refactor: updated controller update uri * refactor: added update chat logic * migration: added creation date to subscriptions * feat: added dates persist to subs * refactor: added select for update method * refactor: permalink update through select for update * refactor: updated dtos * test: updated tests * chore: added jackson jsr310 to tests * feat: added modified at for subscription * migration: added modified at * refactor: select for update telegram chat * refactor: added isolation level * style: style * fix: weird modification timestamp * chore: ignore groovy lint * migration: timestamp in utc * migration: deleted repeatable migration * fix: topic deleted unhandled error * release: from 1.3.10 to 1.4.0 * refactor: removed sout
1 parent 5c98e44 commit ffb2f7e

File tree

27 files changed

+282
-27
lines changed

27 files changed

+282
-27
lines changed

.github/workflows/super-linter.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ jobs:
4040
VALIDATE_NATURAL_LANGUAGE: false
4141
VALIDATE_JSCPD: false
4242
VALIDATE_JAVA: false # make true someday
43+
VALIDATE_GROOVY: false # make true someday
4344
VALIDATE_SQLFLUFF: false
4445
VALIDATE_MARKDOWN_PRETTIER: false
4546
VALIDATE_YAML_PRETTIER: false

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
ext {
9-
set("PROJECT_VERSION", "1.3.10")
9+
set("PROJECT_VERSION", "1.4.0")
1010
}
1111

1212
// doesn't work in build.gradle in buildSrc project

subscriptions_holder/build.gradle

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,16 @@ group = 'ru.dankoy.subscriptionsholder'
2424
dependencies {
2525

2626
// flyway
27-
implementation 'org.flywaydb:flyway-core'
28-
implementation 'org.flywaydb:flyway-database-postgresql'
27+
// starting from spring boot 3.4.0 flyway (10.20.1) behavior is ridiculous
28+
// it applied migrations from tests on production environment
29+
// so I decided to use latest version from maven
30+
// 11.1.0, 11.0.1, 10.22.0 works perfect
31+
// TODO: use versions from spring dep manager (can it even be trusted after this horrendous upgrade?)
32+
implementation 'org.flywaydb:flyway-core:11.1.0'
33+
implementation 'org.flywaydb:flyway-database-postgresql:11.1.0'
34+
35+
// jackson
36+
testImplementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
2937

3038
// jasypt
3139
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/controller/ChatController.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.PathVariable;
78
import org.springframework.web.bind.annotation.PostMapping;
89
import org.springframework.web.bind.annotation.PutMapping;
910
import org.springframework.web.bind.annotation.RequestBody;
1011
import org.springframework.web.bind.annotation.RequestParam;
1112
import org.springframework.web.bind.annotation.RestController;
1213
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub.ChatCreateDTO;
1314
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub.ChatDTO;
15+
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub.ChatUpdateDTO;
1416
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.exceptions.ResourceNotFoundException;
1517
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.service.TelegramChatService;
1618

@@ -47,12 +49,15 @@ public ChatDTO createChat(@RequestBody @Valid ChatCreateDTO chatCreateDTO) {
4749
return ChatDTO.toDTO(saved);
4850
}
4951

50-
@PutMapping("/api/v1/telegram_chat")
51-
public ChatDTO updateChat(@RequestBody @Valid ChatDTO chatDTO) {
52+
@PutMapping("/api/v1/telegram_chat/{id}")
53+
public ChatDTO updateChat(
54+
@PathVariable("id") long id, @RequestBody @Valid ChatUpdateDTO chatDTO) {
5255

53-
var chat = ChatDTO.fromDTO(chatDTO);
56+
chatDTO.setId(id);
5457

55-
var saved = telegramChatService.save(chat);
58+
var chat = ChatUpdateDTO.fromDTO(chatDTO);
59+
60+
var saved = telegramChatService.update(chat);
5661

5762
return ChatDTO.toDTO(saved);
5863
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/domain/Chat.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
import jakarta.persistence.Column;
44
import jakarta.persistence.Entity;
5+
import jakarta.persistence.EntityListeners;
56
import jakarta.persistence.GeneratedValue;
67
import jakarta.persistence.GenerationType;
78
import jakarta.persistence.Id;
89
import jakarta.persistence.Table;
10+
import java.time.LocalDateTime;
911
import lombok.AllArgsConstructor;
1012
import lombok.Data;
1113
import lombok.NoArgsConstructor;
14+
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.jpalisteners.ChatListener;
1215

16+
@EntityListeners(ChatListener.class)
1317
@Entity
1418
@Table(name = "chats")
1519
@Data
@@ -45,4 +49,10 @@ public class Chat {
4549

4650
@Column(name = "message_thread_id")
4751
private Integer messageThreadId;
52+
53+
@Column(name = "date_created", nullable = false)
54+
private LocalDateTime dateCreated;
55+
56+
@Column(name = "date_modified", nullable = true)
57+
private LocalDateTime dateModified;
4858
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/domain/subscriptions/Subscription.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import jakarta.persistence.Column;
44
import jakarta.persistence.Entity;
5+
import jakarta.persistence.EntityListeners;
56
import jakarta.persistence.GeneratedValue;
67
import jakarta.persistence.GenerationType;
78
import jakarta.persistence.Id;
@@ -12,11 +13,14 @@
1213
import jakarta.persistence.NamedAttributeNode;
1314
import jakarta.persistence.NamedEntityGraph;
1415
import jakarta.persistence.Table;
16+
import java.time.LocalDateTime;
1517
import lombok.Data;
1618
import lombok.NoArgsConstructor;
1719
import lombok.experimental.SuperBuilder;
1820
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.domain.Chat;
21+
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.jpalisteners.SubscriptionListener;
1922

23+
@EntityListeners({SubscriptionListener.class})
2024
@NamedEntityGraph(
2125
name = "subscription-full",
2226
attributeNodes = {
@@ -43,4 +47,10 @@ public class Subscription {
4347

4448
@Column(name = "last_permalink")
4549
private String lastPermalink;
50+
51+
@Column(name = "created_at", nullable = false)
52+
private LocalDateTime createdAt;
53+
54+
@Column(name = "modified_at", nullable = false)
55+
private LocalDateTime modifiedAt;
4656
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/dto/channelsub/ChannelSubscriptionDTO.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.channelsub;
22

3+
import java.time.LocalDateTime;
34
import lombok.AllArgsConstructor;
45
import lombok.Getter;
56
import lombok.NoArgsConstructor;
@@ -30,6 +31,10 @@ public class ChannelSubscriptionDTO {
3031

3132
private String lastPermalink;
3233

34+
private LocalDateTime createdAt;
35+
36+
private LocalDateTime modifiedAt;
37+
3338
public static ChannelSubscriptionDTO toDTO(ChannelSub channelSub) {
3439

3540
return new ChannelSubscriptionDTO(
@@ -39,7 +44,9 @@ public static ChannelSubscriptionDTO toDTO(ChannelSub channelSub) {
3944
OrderDTO.toDTO(channelSub.getOrder()),
4045
ScopeDTO.toDTO(channelSub.getScope()),
4146
TypeDTO.toDTO(channelSub.getType()),
42-
channelSub.getLastPermalink());
47+
channelSub.getLastPermalink(),
48+
channelSub.getCreatedAt(),
49+
channelSub.getModifiedAt());
4350
}
4451

4552
public static ChannelSub fromDTO(ChannelSubscriptionDTO dto) {
@@ -52,6 +59,8 @@ public static ChannelSub fromDTO(ChannelSubscriptionDTO dto) {
5259
.scope(ScopeDTO.fromDTO(dto.getScope()))
5360
.type(TypeDTO.fromDTO(dto.getType()))
5461
.lastPermalink(dto.getLastPermalink())
62+
.createdAt(dto.getCreatedAt())
63+
.modifiedAt(dto.getModifiedAt())
5564
.build();
5665
}
5766
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/dto/communitysub/ChatCreateDTO.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public static Chat fromDTO(ChatCreateDTO dto) {
5555
dto.lastName,
5656
dto.username,
5757
dto.active,
58-
dto.messageThreadId);
58+
dto.messageThreadId,
59+
null,
60+
null);
5961
}
6062
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/dto/communitysub/ChatDTO.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub;
22

3+
import java.time.LocalDateTime;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -32,6 +33,10 @@ public class ChatDTO {
3233

3334
private Integer messageThreadId;
3435

36+
private LocalDateTime dateCreated;
37+
38+
private LocalDateTime dateModified;
39+
3540
public static ChatDTO toDTO(Chat chat) {
3641

3742
return builder()
@@ -44,6 +49,8 @@ public static ChatDTO toDTO(Chat chat) {
4449
.username(chat.getUsername())
4550
.active(chat.isActive())
4651
.messageThreadId(chat.getMessageThreadId())
52+
.dateCreated(chat.getDateCreated())
53+
.dateModified(chat.getDateModified())
4754
.build();
4855
}
4956

@@ -58,6 +65,8 @@ public static Chat fromDTO(ChatDTO dto) {
5865
dto.lastName,
5966
dto.username,
6067
dto.active,
61-
dto.messageThreadId);
68+
dto.messageThreadId,
69+
dto.dateCreated,
70+
dto.dateModified);
6271
}
6372
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
import lombok.ToString;
9+
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.domain.Chat;
10+
11+
@ToString
12+
@Getter
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class ChatUpdateDTO {
17+
18+
@Setter private long id;
19+
20+
private long chatId;
21+
22+
private String type;
23+
24+
private String title;
25+
26+
private String firstName;
27+
28+
private String lastName;
29+
30+
private String username;
31+
32+
private boolean active;
33+
34+
private Integer messageThreadId;
35+
36+
public static ChatUpdateDTO toDTO(Chat chat) {
37+
38+
return builder()
39+
.id(chat.getId())
40+
.chatId(chat.getChatId())
41+
.type(chat.getType())
42+
.title(chat.getTitle())
43+
.firstName(chat.getFirstName())
44+
.lastName(chat.getLastName())
45+
.username(chat.getUsername())
46+
.active(chat.isActive())
47+
.messageThreadId(chat.getMessageThreadId())
48+
.build();
49+
}
50+
51+
public static Chat fromDTO(ChatUpdateDTO dto) {
52+
53+
return new Chat(
54+
dto.id,
55+
dto.chatId,
56+
dto.type,
57+
dto.title,
58+
dto.firstName,
59+
dto.lastName,
60+
dto.username,
61+
dto.active,
62+
dto.messageThreadId,
63+
null,
64+
null);
65+
}
66+
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/dto/communitysub/CommunitySubDTO.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.communitysub;
22

3+
import java.time.LocalDateTime;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -25,6 +26,10 @@ public class CommunitySubDTO {
2526

2627
private String lastPermalink;
2728

29+
private LocalDateTime createdAt;
30+
31+
private LocalDateTime modifiedAt;
32+
2833
public static CommunitySubDTO toDTO(CommunitySub communitySubscription) {
2934

3035
return CommunitySubDTO.builder()
@@ -33,6 +38,8 @@ public static CommunitySubDTO toDTO(CommunitySub communitySubscription) {
3338
.section(SectionDTO.toDTO(communitySubscription.getSection()))
3439
.chat(ChatDTO.toDTO(communitySubscription.getChat()))
3540
.lastPermalink(communitySubscription.getLastPermalink())
41+
.createdAt(communitySubscription.getCreatedAt())
42+
.modifiedAt(communitySubscription.getModifiedAt())
3643
.build();
3744
}
3845

@@ -44,6 +51,8 @@ public static CommunitySub fromDTO(CommunitySubDTO dto) {
4451
.section(SectionDTO.fromDTO(dto.getSection()))
4552
.chat(ChatDTO.fromDTO(dto.getChat()))
4653
.lastPermalink(dto.getLastPermalink())
54+
.createdAt(dto.getCreatedAt())
55+
.modifiedAt(dto.getModifiedAt())
4756
.build();
4857
}
4958
}

subscriptions_holder/src/main/java/ru/dankoy/subscriptionsholder/subscriptions_holder/core/dto/tagsubscription/TagSubscriptionDTO.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.dto.tagsubscription;
22

3+
import java.time.LocalDateTime;
34
import lombok.AllArgsConstructor;
45
import lombok.Getter;
56
import lombok.NoArgsConstructor;
@@ -27,6 +28,10 @@ public class TagSubscriptionDTO {
2728

2829
private String lastPermalink;
2930

31+
private LocalDateTime createdAt;
32+
33+
private LocalDateTime modifiedAt;
34+
3035
public static TagSubscriptionDTO toDTO(TagSub tagSubscription) {
3136

3237
return new TagSubscriptionDTO(
@@ -36,7 +41,9 @@ public static TagSubscriptionDTO toDTO(TagSub tagSubscription) {
3641
OrderDTO.toDTO(tagSubscription.getOrder()),
3742
ScopeDTO.toDTO(tagSubscription.getScope()),
3843
TypeDTO.toDTO(tagSubscription.getType()),
39-
tagSubscription.getLastPermalink());
44+
tagSubscription.getLastPermalink(),
45+
tagSubscription.getCreatedAt(),
46+
tagSubscription.getModifiedAt());
4047
}
4148

4249
public static TagSub fromDTO(TagSubscriptionDTO dto) {
@@ -49,6 +56,8 @@ public static TagSub fromDTO(TagSubscriptionDTO dto) {
4956
.scope(ScopeDTO.fromDTO(dto.getScope()))
5057
.type(TypeDTO.fromDTO(dto.getType()))
5158
.lastPermalink(dto.getLastPermalink())
59+
.createdAt(dto.getCreatedAt())
60+
.modifiedAt(dto.getModifiedAt())
5261
.build();
5362
}
5463
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package ru.dankoy.subscriptionsholder.subscriptions_holder.core.jpalisteners;
2+
3+
import jakarta.persistence.PrePersist;
4+
import jakarta.persistence.PreUpdate;
5+
import java.time.LocalDateTime;
6+
import java.time.ZoneOffset;
7+
import ru.dankoy.subscriptionsholder.subscriptions_holder.core.domain.Chat;
8+
9+
public class ChatListener {
10+
11+
@PrePersist
12+
public void prePersist(Chat chat) {
13+
if (chat.getDateCreated() == null) {
14+
chat.setDateCreated(LocalDateTime.now(ZoneOffset.UTC));
15+
}
16+
}
17+
18+
@PreUpdate
19+
public void preUpdate(Chat chat) {
20+
chat.setDateModified(LocalDateTime.now(ZoneOffset.UTC));
21+
}
22+
}

0 commit comments

Comments
 (0)