Skip to content

Commit d96c4a7

Browse files
Merge pull request #8083 from ita-social-projects/feature/8050/Add-AI-Generated-Eco-News-Feature-to-Manage-Eco-News-Page
Added the ability to generate Eco News from the Manage Eco News Page
2 parents aeebe5a + d9df2de commit d96c4a7

File tree

7 files changed

+80
-3
lines changed

7 files changed

+80
-3
lines changed

core/src/main/java/greencity/controller/AIController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public ResponseEntity<String> forecast(@Parameter(hidden = true) @CurrentUser Us
6060
public ResponseEntity<String> creatingEcoNews(@Parameter(hidden = true) Locale locale,
6161
@RequestParam(required = false) String query) {
6262
return ResponseEntity.status(HttpStatus.OK)
63-
.body(aiService.getNews(locale.getDisplayLanguage(), query));
63+
.body(
64+
aiService.getNews(locale.toString().equals("ua") ? "українська" : locale.getDisplayLanguage(), query));
6465
}
6566
}

core/src/main/resources/messages.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ greenCity.pages.popup.hidden.EcoNews=This Eco News is hidden and is not visible
178178
greenCity.pages.popup.goback.=Go Back
179179
greenCity.pages.popup.update.=Update
180180
greenCity.pages.popup.preview.= Preview
181+
greenCity.pages.popup.generate=Generate
181182
/*paginationpages*/
182183
greenCity.page.paging.show=Showing
183184
greenCity.page.paging.out.of=out of
@@ -206,6 +207,8 @@ greenCity.econews.page.comment=comment
206207
greenCity.econews.page.view.userLikes=Users who liked post
207208
greenCity.econews.page.view.userDislikes=Users who disliked post
208209
greenCity.econews.page.view=view
210+
greenCity.econews.page.ai.h=Generate AI Eco News
211+
greenCity.econews.page.ai.topic=Enter topic for Eco News generation:
209212
/*events*/
210213
greenCity.events.page.h=Manage Events
211214
greenCity.events.page.add.event=Add Event

core/src/main/resources/messages_ua.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ greenCity.pages.popup.types.=\u0412\u0441\u0456 \u0442\u0438\u043f\u0438
163163
greenCity.pages.popup.goback.=\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438\u0441\u044c
164164
greenCity.pages.popup.save.changes=\u0053\u0061\u0076\u0065 \u0063\u0068\u0061\u006e\u0067\u0065\u0073
165165
greenCity.pages.popup.preview.= \u041f\u0440\u0435\u0432\u0027\u044e
166+
greenCity.pages.popup.generate=\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438
166167
167168
greenCity.pages.popup.hidden.EcoNews=\u0426\u044f\u0020\u0415\u043a\u043e\u0020\u041d\u043e\u0432\u0438\u043d\u0430\u0020\u043f\u0440\u0438\u0445\u043e\u0432\u0430\u043d\u0430\u0020\u0456\u0020\u043d\u0435\u0020\u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0454\u0442\u044c\u0441\u044f\u0020\u0434\u043b\u044f\u0020\u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432\u002e
168169
@@ -195,6 +196,8 @@ greenCity.econews.page.delete.eco.news=\u0412\u0438\u0434\u0430\u043B\u0438\u044
195196
greenCity.econews.page.edit.eco.news=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438\u0020\u0415\u043A\u043E\u0020\u041D\u043E\u0432\u0438\u043D\u0438
196197
greenCity.econews.page.comments=\u041A\u043E\u043C\u0435\u043D\u0442\u0430\u0440\u0456
197198
greenCity.econews.page.comment=\u043A\u043E\u043C\u0435\u043D\u0442\u0456\u0432
199+
greenCity.econews.page.ai.h=\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 AI \u0415\u043a\u043e \u041d\u043e\u0432\u0438\u043d\u0438
200+
greenCity.econews.page.ai.topic=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0415\u043a\u043e \u041d\u043e\u0432\u0438\u043d:
198201
199202
/*events*/
200203
greenCity.events.page.h=\u041C\u0435\u043D\u0435\u0440\u0436\u0435\u0440 \u043F\u043E\u0434\u0456\u0439

core/src/main/resources/static/management/econews/buttonsAJAX.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,52 @@ $(document).ready(function () {
346346

347347
});
348348

349+
//generate EcoNews content button in addEcoNewsModal
350+
$('#toggleGenerateEcoNewsForm').on('click', function (event) {
351+
const form = document.getElementById('generateEcoNewsForm');
352+
form.style.display = form.style.display === 'none' ? 'block' : 'none';
353+
});
354+
355+
$('#generateEcoNewsContent').on('click', function (event) {
356+
const query = $('#generateQueryInput').val().trim();
357+
const language = localStorage.getItem("language") || "en";
358+
const locale = language === "ua" ? "uk-UA" : "en-US";
359+
360+
const $button = $(this);
361+
$button.prop('disabled', true);
362+
document.getElementById("errorModalGenerateContent").innerText = 'Generating content...';
363+
364+
$.ajax({
365+
url: '/ai/generate/eco-news',
366+
type: 'GET',
367+
data: { query: query },
368+
headers: { 'Accept-Language': locale },
369+
contentType: 'application/json',
370+
success: function (response) {
371+
const titleMatch = response.match(/\*\*Title:\s*(.+?)\s*\*\*/) || response.match(/\*\*\s*(.+?)\s*\*\*/);
372+
373+
if (titleMatch) {
374+
const title = titleMatch[1];
375+
$('#inputTitle').val(title);
376+
377+
const updatedContent = response.replace(titleMatch[0], '').trim();
378+
379+
tinymce.get('ecoNewsContent').setContent(updatedContent);
380+
} else {
381+
tinymce.get('ecoNewsContent').setContent(response);
382+
}
383+
document.getElementById("errorModalGenerateContent").innerText = '';
384+
},
385+
error: function (xhr, status, error) {
386+
document.getElementById("errorModalGenerateContent").innerText =
387+
'Failed to generate Eco News content. Please try again.';
388+
},
389+
complete: function() {
390+
$button.prop('disabled', false);
391+
}
392+
});
393+
});
394+
349395
//view users who liked/disliked modal
350396
$('.open-likesButton').on("click", function () {
351397
let newsId = $(this).data('id');

core/src/main/resources/templates/core/management_eco_news.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,19 @@ <h4 class="modal-title">[[#{greenCity.econews.page.add.eco.news}]]</h4>
529529
<textarea id="ecoNewsContent" type="text" class="form-control" name="text" required></textarea>
530530
<span th:id="errorModalSavetext" id="errorModalSavetext" class="errorSpan"></span>
531531
</div>
532+
533+
<button type="button" class="btn btn-default" id="toggleGenerateEcoNewsForm">[[#{greenCity.econews.page.ai.h}]]</button>
534+
535+
<div id="generateEcoNewsForm" style="display: none; margin: 15px 0;">
536+
<div class="form-group">
537+
<label for="generateQueryInput">[[#{greenCity.econews.page.ai.topic}]]</label>
538+
<input type="text" id="generateQueryInput" class="form-control">
539+
<span th:id="errorModalGenerateContent" id="errorModalGenerateContent" class="errorSpan"></span>
540+
</div>
541+
<button type="button" class="btn btn-secondary" id="generateEcoNewsContent">[[#{greenCity.pages.popup.generate}]]</button>
542+
</div>
543+
544+
532545
<div class="form-group">
533546
<label>[[#{greenCity.pages.table.tags}]]</label>
534547
<div class="form-check" th:each="allTags, iterStatus: ${ecoNewsTag}" name="tags">

core/src/test/java/greencity/controller/AIControllerTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,16 @@ void creatingEcoNewsReturnsEcoNewsFromAIServiceTest() throws Exception {
6464

6565
verify(aiService, times(1)).getNews(eq(testLocale.getDisplayLanguage()), any());
6666
}
67+
68+
@Test
69+
void creatingEcoNewsReturnsEcoNewsFromAIServiceWithLocaleUATest() throws Exception {
70+
Locale testLocale = Locale.forLanguageTag("ua");
71+
72+
mockMvc.perform(get("/ai/generate/eco-news")
73+
.principal(principal)
74+
.locale(testLocale))
75+
.andExpect(status().isOk());
76+
77+
verify(aiService, times(1)).getNews(eq("українська"), any());
78+
}
6779
}

service/src/main/java/greencity/service/EcoNewsServiceImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ public AddEcoNewsDtoResponse save(AddEcoNewsDtoRequest addEcoNewsDtoRequest,
102102
UserVO userVO = userService.findById(toSave.getAuthor().getId());
103103
achievementCalculation
104104
.calculateAchievement(userVO, AchievementCategoryType.CREATE_NEWS, AchievementAction.ASSIGN);
105-
ratingCalculation.ratingCalculation(ratingPointsRepo.findByNameOrThrow("CREATE_NEWS"),
106-
modelMapper.map(toSave, UserVO.class));
105+
ratingCalculation.ratingCalculation(ratingPointsRepo.findByNameOrThrow("CREATE_NEWS"), userVO);
107106
userNotificationService.createNewNotification(userVO, NotificationType.ECONEWS_CREATED, toSave.getId(),
108107
toSave.getTitle());
109108
return modelMapper.map(toSave, AddEcoNewsDtoResponse.class);

0 commit comments

Comments
 (0)