Skip to content

Commit 87d26fa

Browse files
authored
Merge pull request #118 from Endpool/ilyha-dev/ingredient_search_enhancement
fix: rework of moderation history for new backend signature
2 parents f776ec1 + fa36963 commit 87d26fa

15 files changed

Lines changed: 88 additions & 49 deletions

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ build/Release/CMakeCache.txt: conanfile.txt
2727
build-debug: build/Debug/CMakeCache.txt
2828
cmake --build --preset=conan-debug
2929
build-debug-j5: build/Release/CMakeCache.txt
30-
cmake --build . --preset=conan-debug -- -j3
30+
cmake --build . --preset=conan-debug -- -j2
3131
build-release: build/Release/CMakeCache.txt
3232
cmake --build --preset=conan-release
3333

src/backend/models/ingredient.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
#include <boost/json/value_to.hpp>
77
#include <optional>
88

9-
#include <optional>
10-
119
namespace cookcookhnya::api::models::ingredient {
1210

1311
namespace json = boost::json;

src/backend/models/moderation.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ PublicationRequest tag_invoke(json::value_to_tag<PublicationRequest> /*tag*/, co
1717
return {
1818
.name = value_to<decltype(PublicationRequest::name)>(j.at("name")),
1919
.requestType = value_to<decltype(PublicationRequest::requestType)>(j.at("requestType")),
20-
.status = j.as_object().if_contains("status") ? value_to<PublicationRequestStatus>(j.at("status"))
21-
: PublicationRequestStatus::NO_REQUEST,
20+
.status = j.as_object().if_contains("status")
21+
? value_to<PublicationRequestStatusStruct>(j.at("status"))
22+
: PublicationRequestStatusStruct{.status = PublicationRequestStatus::NO_REQUEST,
23+
.reason = std::nullopt},
2224
.created = utils::parseIsoTime(value_to<std::string>(j.at("createdAt"))),
2325
.updated = j.as_object().if_contains("updatedAt")
2426
? std::optional{utils::parseIsoTime(value_to<std::string>(j.at("updatedAt")))}
2527
: std::nullopt,
26-
.reason = j.as_object().if_contains("reason") ? value_to<decltype(PublicationRequest::reason)>(j.at("reason"))
27-
: std::nullopt,
2828
};
2929
}
3030

src/backend/models/moderation.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ namespace cookcookhnya::api::models::moderation {
1313
struct PublicationRequest {
1414
std::string name;
1515
std::string requestType;
16-
PublicationRequestStatus status = PublicationRequestStatus::NO_REQUEST;
16+
PublicationRequestStatusStruct status;
1717
std::chrono::system_clock::time_point created;
1818
std::optional<std::chrono::system_clock::time_point> updated;
19-
std::optional<std::string> reason;
2019

2120
friend PublicationRequest tag_invoke(boost::json::value_to_tag<PublicationRequest>, const boost::json::value& j);
2221
};

src/backend/models/publication_request_status.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
#include "utils/utils.hpp"
44

5+
#include <array>
56
#include <boost/json/conversion.hpp>
67
#include <boost/json/value.hpp>
7-
8-
#include <array>
8+
#include <boost/json/value_from.hpp>
9+
#include <boost/json/value_to.hpp>
910
#include <cstddef>
1011
#include <string>
1112

@@ -20,6 +21,18 @@ PublicationRequestStatus tag_invoke(boost::json::value_to_tag<PublicationRequest
2021
if (j == "rejected")
2122
return PublicationRequestStatus::REJECTED;
2223
return PublicationRequestStatus::NO_REQUEST;
24+
};
25+
26+
PublicationRequestStatusStruct tag_invoke(boost::json::value_to_tag<PublicationRequestStatusStruct> /*unused*/,
27+
const boost::json::value& j) {
28+
if (j.is_object()) {
29+
return {.status = j.as_object().if_contains("type") ? value_to<PublicationRequestStatus>(j.at("type"))
30+
: PublicationRequestStatus::NO_REQUEST,
31+
.reason = j.as_object().if_contains("reason")
32+
? value_to<decltype(PublicationRequestStatusStruct::reason)>(j.at("reason"))
33+
: std::nullopt};
34+
}
35+
return {.status = PublicationRequestStatus::NO_REQUEST, .reason = std::nullopt};
2336
}
2437

2538
} // namespace cookcookhnya::api::models::moderation

src/backend/models/publication_request_status.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <boost/json/value.hpp>
55

66
#include <cstdint>
7+
#include <optional>
78
#include <string>
89

910
namespace cookcookhnya::api::models::moderation {
@@ -12,6 +13,14 @@ enum class PublicationRequestStatus : std::uint8_t { PENDING, ACCEPTED, REJECTED
1213

1314
PublicationRequestStatus tag_invoke(boost::json::value_to_tag<PublicationRequestStatus>, const boost::json::value& j);
1415

16+
struct PublicationRequestStatusStruct {
17+
PublicationRequestStatus status = PublicationRequestStatus::NO_REQUEST;
18+
std::optional<std::string> reason;
19+
20+
friend PublicationRequestStatusStruct tag_invoke(boost::json::value_to_tag<PublicationRequestStatusStruct>,
21+
const boost::json::value& j);
22+
};
23+
1524
} // namespace cookcookhnya::api::models::moderation
1625

1726
namespace cookcookhnya::utils {

src/backend/models/recipe.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ SuggestedRecipeDetails tag_invoke(json::value_to_tag<SuggestedRecipeDetails> /*t
6868
.name = value_to<decltype(SuggestedRecipeDetails::name)>(j.at("name")),
6969
.link = value_to<decltype(SuggestedRecipeDetails::link)>(j.at("sourceLink")),
7070
// Deal with optionals using ternary operator
71-
.creator = j.as_object().if_contains("creator")
72-
? value_to<decltype(SuggestedRecipeDetails::creator)>(j.at("creator"))
73-
: std::nullopt,
74-
.moderationStatus = j.as_object().if_contains("moderationStatus")
75-
? value_to<PublicationRequestStatus>(j.at("moderationStatus"))
76-
: PublicationRequestStatus::NO_REQUEST,
71+
.creator = j.as_object().if_contains("creator") ? value_to<decltype(RecipeDetails::creator)>(j.at("creator"))
72+
: std::nullopt,
73+
.moderationStatus =
74+
j.as_object().if_contains("moderationStatus")
75+
? value_to<moderation::PublicationRequestStatusStruct>(j.at("moderationStatus"))
76+
: moderation::PublicationRequestStatusStruct{.status = PublicationRequestStatus::NO_REQUEST,
77+
.reason = std::nullopt},
78+
7779
};
7880
}
7981

@@ -86,15 +88,14 @@ RecipeSearchResponse tag_invoke(json::value_to_tag<RecipeSearchResponse> /*tag*/
8688

8789
RecipePublicationRequest tag_invoke(json::value_to_tag<RecipePublicationRequest> /*tag*/, const json::value& j) {
8890
return {
89-
.status = j.as_object().if_contains("status") ? value_to<moderation::PublicationRequestStatus>(j.at("status"))
90-
: moderation::PublicationRequestStatus::NO_REQUEST,
91+
.status = j.as_object().if_contains("status")
92+
? value_to<moderation::PublicationRequestStatusStruct>(j.at("status"))
93+
: moderation::PublicationRequestStatusStruct{.status = PublicationRequestStatus::NO_REQUEST,
94+
.reason = std::nullopt},
9195
.created = utils::parseIsoTime(value_to<std::string>(j.at("createdAt"))),
9296
.updated = j.as_object().if_contains("updatedAt")
9397
? std::optional{utils::parseIsoTime(value_to<std::string>(j.at("updatedAt")))}
9498
: std::nullopt,
95-
.reason = j.as_object().if_contains("reason")
96-
? value_to<decltype(RecipePublicationRequest::reason)>(j.at("reason"))
97-
: std::nullopt,
9899
};
99100
}
100101

src/backend/models/recipe.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct SuggestedRecipeDetails {
5555
std::string name;
5656
std::optional<std::string> link;
5757
std::optional<user::UserDetails> creator;
58-
moderation::PublicationRequestStatus moderationStatus = moderation::PublicationRequestStatus::NO_REQUEST;
58+
moderation::PublicationRequestStatusStruct moderationStatus;
5959

6060
friend SuggestedRecipeDetails tag_invoke(boost::json::value_to_tag<SuggestedRecipeDetails>,
6161
const boost::json::value& j);
@@ -93,10 +93,9 @@ struct RecipeSearchResponse {
9393
};
9494

9595
struct RecipePublicationRequest {
96-
moderation::PublicationRequestStatus status = moderation::PublicationRequestStatus::NO_REQUEST;
96+
moderation::PublicationRequestStatusStruct status;
9797
std::chrono::system_clock::time_point created;
9898
std::optional<std::chrono::system_clock::time_point> updated;
99-
std::optional<std::string> reason;
10099

101100
friend RecipePublicationRequest tag_invoke(boost::json::value_to_tag<RecipePublicationRequest>,
102101
const boost::json::value& j);

src/handlers/personal_account/recipe/moderation_history.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void handleCustomRecipePublicationHistoryCQ(
1717

1818
if (data == "backFromRules") {
1919
auto history = api.getRecipesApi().getRecipeRequestHistory(userId, state.recipeId);
20-
renderPublicationHistory(userId, chatId, state.recipeName, history, bot);
20+
renderPublicationHistory(userId, chatId, state.recipeName, state.errorReport, history, bot);
2121
bot.answerCallbackQuery(cq.id);
2222
return;
2323
}
@@ -36,19 +36,25 @@ void handleCustomRecipePublicationHistoryCQ(
3636
}
3737

3838
if (data == "confirm") {
39-
// Peeking (if button with this data then accepted or pending)
40-
auto history = api.getRecipesApi().getRecipeRequestHistory(userId, state.recipeId);
4139

40+
auto history = api.getRecipesApi().getRecipeRequestHistory(userId, state.recipeId);
4241
// Here check for emptiness first, thanks to lazy compilator
43-
const bool shouldPublish =
44-
history.empty() || (history.back().status == api::models::moderation::PublicationRequestStatus::REJECTED);
42+
const bool shouldPublish = history.empty() || (history.back().status.status ==
43+
api::models::moderation::PublicationRequestStatus::REJECTED);
4544

4645
if (shouldPublish) {
47-
api.getRecipesApi().publishCustom(userId, state.recipeId);
46+
try {
47+
api.getRecipesApi().publishCustom(userId, state.recipeId);
48+
state.errorReport = "";
49+
} catch (...) {
50+
state.errorReport =
51+
utils::utf8str(u8"⚠️Что-то пошло не так, вероятно ваш рецепт содержит неопубликованные ингредиенты");
52+
bot.answerCallbackQuery(cq.id);
53+
}
4854
// Get updated history
4955
history = api.getRecipesApi().getRecipeRequestHistory(userId, state.recipeId);
5056
}
51-
renderPublicationHistory(userId, chatId, state.recipeName, history, bot);
57+
renderPublicationHistory(userId, chatId, state.recipeName, state.errorReport, history, bot);
5258
bot.answerCallbackQuery(cq.id);
5359
return;
5460
}

src/handlers/personal_account/recipe/view.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ void handleRecipeCustomViewCQ(
5151

5252
if (data == "publish") {
5353
auto history = api.getRecipesApi().getRecipeRequestHistory(userId, state.recipeId);
54-
renderPublicationHistory(userId, chatId, state.recipeName, history, bot);
54+
std::string temp;
55+
renderPublicationHistory(userId, chatId, state.recipeName, temp, history, bot);
5556
stateManager.put(CustomRecipePublicationHistory{
56-
.recipeId = state.recipeId, .pageNo = state.pageNo, .recipeName = state.recipeName});
57+
.recipeId = state.recipeId, .pageNo = state.pageNo, .recipeName = state.recipeName, .errorReport = ""});
5758
bot.answerCallbackQuery(cq.id);
5859
return;
5960
}

0 commit comments

Comments
 (0)