Skip to content

Commit 510f055

Browse files
committed
Add podcast generation and refactor summary services
Introduced podcast generation via a new `PodcastServiceImpl` using AI clients to generate scripts based on book summaries. Refactored models, configurations, and service classes to improve consistency, maintainability, and alignment with new features. Enhanced JSON handling and adjusted application properties to support updated AI configurations.
1 parent 9a03f26 commit 510f055

File tree

22 files changed

+275
-119
lines changed

22 files changed

+275
-119
lines changed

docs/desing.vsdx

39.8 KB
Binary file not shown.

src/main/java/app/quantun/summary/config/ai/AiConfig.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
import org.springframework.ai.anthropic.AnthropicChatModel;
55
import org.springframework.ai.chat.client.ChatClient;
66
import org.springframework.ai.openai.OpenAiChatModel;
7-
import org.springframework.ai.openai.OpenAiChatOptions;
8-
import org.springframework.ai.openai.api.OpenAiApi;
97
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
10-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
118
import org.springframework.context.annotation.Bean;
129
import org.springframework.context.annotation.Configuration;
13-
import org.springframework.context.annotation.Primary;
1410

1511
/**
1612
* Configuration class for AI chat clients.
@@ -28,7 +24,9 @@ public class AiConfig {
2824
*/
2925
//@Primary
3026
@Bean
31-
ChatClient openAiChatClient(OpenAiChatModel chatModel) { return ChatClient.create(chatModel); }
27+
ChatClient openAiChatClient(OpenAiChatModel chatModel) {
28+
return ChatClient.create(chatModel);
29+
}
3230

3331

3432
@Bean
@@ -43,5 +41,4 @@ ChatClient anthropicChatClient(AnthropicChatModel chatModel) {
4341
}
4442

4543

46-
4744
}

src/main/java/app/quantun/summary/config/ai/PerplexityProperties.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package app.quantun.summary.config.ai;
22

33
import lombok.Data;
4-
import org.springframework.boot.context.properties.ConfigurationProperties;
54

65
// Configuration Properties Class
76
//@ConfigurationProperties(prefix = "spring.ai.perplexity")

src/main/java/app/quantun/summary/config/serializer/JacksonConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
import com.fasterxml.jackson.databind.DeserializationFeature;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5-
65
import com.fasterxml.jackson.databind.module.SimpleModule;
76
import com.google.protobuf.Message;
7+
import com.google.protobuf.UnknownFieldSet;
88
import org.springframework.context.annotation.Bean;
99
import org.springframework.context.annotation.Configuration;
10-
import com.google.protobuf.UnknownFieldSet;
1110

1211
@Configuration
1312
public class JacksonConfig {

src/main/java/app/quantun/summary/controller/PdfController.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package app.quantun.summary.controller;
22

33
import app.quantun.summary.model.contract.dto.TableIndexContent;
4-
import app.quantun.summary.model.contract.request.Answer;
54
import app.quantun.summary.service.PdfServices;
65
import io.swagger.v3.oas.annotations.Operation;
76
import io.swagger.v3.oas.annotations.media.Content;
@@ -55,13 +54,10 @@ public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFi
5554
return ResponseEntity.ok("File uploaded successfully: " + fileName);
5655
}
5756

58-
@PostMapping("/get-table-of-content")
57+
@PostMapping("/get-table-of-content")
5958
public TableIndexContent getTableOfContent(String message) {
6059
return this.pdfServices.getBookTableOfContentPages(message);
6160
}
6261

6362

64-
65-
66-
6763
}

src/main/java/app/quantun/summary/message/consumer/SummaryBookConsumerImpl.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package app.quantun.summary.message.consumer;
22

3-
import app.quantun.summary.message.producer.SummaryBookProducerService;
43
import app.quantun.summary.model.contract.message.BookFilePayload;
54
import app.quantun.summary.model.entity.Book;
65
import app.quantun.summary.repository.BookRepository;
7-
8-
import app.quantun.summary.service.impl.SummaryServicesImpl;
6+
import app.quantun.summary.service.PodcastService;
7+
import app.quantun.summary.service.SummaryServices;
98
import lombok.RequiredArgsConstructor;
109
import lombok.extern.slf4j.Slf4j;
1110
import lombok.val;
@@ -28,7 +27,9 @@ public class SummaryBookConsumerImpl implements SummaryBookConsumer {
2827

2928
private final BookRepository summaryBookRepository;
3029

31-
private final SummaryServicesImpl summaryServices;
30+
private final SummaryServices summaryServices;
31+
32+
private final PodcastService podCastService;
3233

3334

3435
@KafkaListener(
@@ -73,7 +74,6 @@ public void processMessages(List<BookFilePayload> messages) {
7374
log.info("Book with id {} already exists in the database", message.id());
7475

7576
this.makeSummary(book);
76-
this.makeScript(book);
7777
this.makePodcast(book);
7878
this.saveChanges(book);
7979

@@ -96,23 +96,21 @@ private void saveChanges(Book book) {
9696
log.info("Saving changes for book with id: {}", book.getId());
9797
this.summaryBookRepository.save(book);
9898
log.info("Successfully saved changes for book with id: {}", book.getId());
99-
} catch (Exception e)
100-
{
99+
} catch (Exception e) {
101100
log.error("Failed to save changes for book with id: {}. Error: {}", book.getId(), e.getMessage());
102101

103102
}
104103
}
105104

106-
private void makePodcast(Book book) {
107105

108-
}
109-
110-
private void makeScript(Book book) {
106+
private void makePodcast(Book book) {
107+
val podCast = this.podCastService.createScript(book);
108+
book.setPodCast(podCast);
111109

112110
}
113111

114112
private void makeSummary(Book book) {
115-
val summary=summaryServices.summarizeBook(book);
113+
val summary = summaryServices.summarizeBook(book);
116114
book.setTextSummary(summary);
117115

118116
}

src/main/java/app/quantun/summary/model/contract/dto/BookSummary.java

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package app.quantun.summary.model.contract.dto;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4-
import lombok.*;
5-
import java.util.List;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
69
import java.util.ArrayList;
10+
import java.util.List;
711

812
@Data
913
@Builder
@@ -12,11 +16,15 @@
1216
@JsonIgnoreProperties(ignoreUnknown = true)
1317
public class BookSummary {
1418
private Metadata metadata = new Metadata();
15-
private IntroductionBlueprint introduction = new IntroductionBlueprint();
16-
@Builder.Default private CoreElementsBreakdown coreElements = new CoreElementsBreakdown();
17-
@Builder.Default private List<Chapter> chapterDigest = new ArrayList<>();
18-
@Builder.Default private CriticalAnalysisFramework analysis = new CriticalAnalysisFramework();
19-
@Builder.Default private ActionableTakeawaySystem takeaways = new ActionableTakeawaySystem();
19+
private IntroductionBlueprint introduction = new IntroductionBlueprint();
20+
@Builder.Default
21+
private CoreElementsBreakdown coreElements = new CoreElementsBreakdown();
22+
@Builder.Default
23+
private List<Chapter> chapterDigest = new ArrayList<>();
24+
@Builder.Default
25+
private CriticalAnalysisFramework analysis = new CriticalAnalysisFramework();
26+
@Builder.Default
27+
private ActionableTakeawaySystem takeaways = new ActionableTakeawaySystem();
2028

2129
@Data
2230
@Builder
@@ -49,18 +57,23 @@ public static class IntroductionBlueprint {
4957
@AllArgsConstructor
5058
@JsonIgnoreProperties(ignoreUnknown = true)
5159
public static class CoreElementsBreakdown {
52-
@Builder.Default private PlotArchitecture plot = new PlotArchitecture();
53-
@Builder.Default private List<CharacterEntry> characters = new ArrayList<>();
54-
@Builder.Default private ThemeNetwork themes = new ThemeNetwork();
55-
@Builder.Default private StyleAnalysis style = new StyleAnalysis();
60+
@Builder.Default
61+
private PlotArchitecture plot = new PlotArchitecture();
62+
@Builder.Default
63+
private List<CharacterEntry> characters = new ArrayList<>();
64+
@Builder.Default
65+
private ThemeNetwork themes = new ThemeNetwork();
66+
@Builder.Default
67+
private StyleAnalysis style = new StyleAnalysis();
5668

5769
@Data
5870
@Builder
5971
@NoArgsConstructor
6072
@AllArgsConstructor
6173
public static class PlotArchitecture {
6274
private String centralConflict;
63-
@Builder.Default private List<String> narrativeArc = new ArrayList<>();
75+
@Builder.Default
76+
private List<String> narrativeArc = new ArrayList<>();
6477
}
6578

6679
@Data
@@ -82,8 +95,10 @@ public static class CharacterEntry {
8295
@JsonIgnoreProperties(ignoreUnknown = true)
8396
public static class ThemeNetwork {
8497
private String primaryTheme;
85-
@Builder.Default private List<String> supportingThemes = new ArrayList<>();
86-
@Builder.Default private List<String> recurringMotifs = new ArrayList<>();
98+
@Builder.Default
99+
private List<String> supportingThemes = new ArrayList<>();
100+
@Builder.Default
101+
private List<String> recurringMotifs = new ArrayList<>();
87102
}
88103

89104
@Data
@@ -129,9 +144,12 @@ public static class CriticalAnalysisFramework {
129144
@AllArgsConstructor
130145
@JsonIgnoreProperties(ignoreUnknown = true)
131146
public static class ActionableTakeawaySystem {
132-
@Builder.Default private List<String> practicalApplications = new ArrayList<>();
133-
@Builder.Default private List<String> discussionPrompts = new ArrayList<>();
134-
@Builder.Default private List<String> furtherExploration = new ArrayList<>();
147+
@Builder.Default
148+
private List<String> practicalApplications = new ArrayList<>();
149+
@Builder.Default
150+
private List<String> discussionPrompts = new ArrayList<>();
151+
@Builder.Default
152+
private List<String> furtherExploration = new ArrayList<>();
135153
}
136154
}
137155

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package app.quantun.summary.model.contract.dto;
2+
3+
4+
import app.quantun.summary.model.entity.Script;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
11+
import java.util.TreeSet;
12+
13+
@Data
14+
@Builder
15+
@AllArgsConstructor
16+
@NoArgsConstructor
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public class PodCast {
19+
20+
21+
private String title;
22+
private Long duration;
23+
24+
25+
private TreeSet<Script> scripts;
26+
27+
28+
}

src/main/java/app/quantun/summary/model/contract/dto/TableIndexContent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
55

66
import java.util.List;
7+
78
@JsonIgnoreProperties(ignoreUnknown = true)
89

910
public record TableIndexContent(List<IndexContent> indexContents) {

src/main/java/app/quantun/summary/model/entity/Book.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package app.quantun.summary.model.entity;
22

33
import app.quantun.summary.model.contract.dto.BookSummary;
4+
import app.quantun.summary.model.contract.dto.PodCast;
45
import jakarta.persistence.*;
56
import lombok.*;
67
import org.hibernate.annotations.Type;
@@ -29,7 +30,8 @@ public class Book {
2930
@Column(columnDefinition = "jsonb")
3031
private BookSummary textSummary;
3132

32-
@ManyToOne(fetch = FetchType.LAZY)
33+
@Type(io.hypersistence.utils.hibernate.type.json.JsonType.class)
34+
@Column(columnDefinition = "jsonb")
3335
private PodCast podCast;
3436

3537

0 commit comments

Comments
 (0)