Skip to content

Feat/281 Controlador y endpoint completo para ver recursos de un reto #852

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 84 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
cb5a96d
añadido nuevo parametro al enum de ChallengeStatus
Almami679 Apr 24, 2025
708e64b
creation SolvedDto
Apr 27, 2025
d172659
added field times_solved to ChallengeDto
Apr 27, 2025
f65f94a
added field timesSolved and method increase to ChallengeDocument
Apr 27, 2025
392c8d2
added solved to the enum UserChallengeActionType
Apr 27, 2025
60f89f9
added getTimesSolved to method convertDtoToDocument
Apr 27, 2025
3fb18ae
[feat] Obtener recursos asociados a un challengeId (servicio + reposi…
Sh1ng0 Apr 28, 2025
b6dfe9e
updated tests
RustyGearBox Apr 28, 2025
b3d270d
Eliminados comentarios innecesarios
Sh1ng0 Apr 29, 2025
17588ee
Merge branch 'develop' into #270_Añadir_nuevo_status_de_Challenge_INP…
Almami679 Apr 29, 2025
cc1eaca
feat: añadir controlador y tests para los recursos del reto
Sh1ng0 Apr 29, 2025
bba8eae
faltaba añadir la ruta del get
Sh1ng0 Apr 29, 2025
049bc0a
corrección de nomenclatura de ruta
Sh1ng0 Apr 29, 2025
16a9ec0
Fix: updated ResourceControllerTest to match updated endpoint path
Sh1ng0 Apr 29, 2025
102278b
Added endpoint to changelog
Sh1ng0 Apr 29, 2025
6d84c7e
Add MarcBernabeuRodriguez to contributors.yml
trisk910 Apr 29, 2025
edc43c7
Merge branch 'develop' into feat/280-controlador
Sh1ng0 Apr 29, 2025
e779a68
fix test method getChallengeDtoMocked
RustyGearBox Apr 29, 2025
ae4051b
Merge branch 'develop' into feature/252-Increase-solvedCounter-from-c…
RustyGearBox Apr 29, 2025
9477a52
Merge branch 'develop' into #270_Añadir_nuevo_status_de_Challenge_INP…
Almami679 Apr 29, 2025
5f25931
added SolvedDtoTest
Apr 29, 2025
4b1ec13
added tests for counterSolved
Apr 29, 2025
d6466ff
update determinateChallengeStatus() method
Almami679 Apr 30, 2025
d922240
deleted comments ChallangeTest
Apr 30, 2025
ce2112b
added UserChallengeActionType value to CHANGELOG
Apr 30, 2025
7c45bc5
Add Santiago Hernandez to contributors list
Apr 30, 2025
cd1b3a2
deleted #844 enum modif
RustyGearBox Apr 30, 2025
3654dca
Ivan's Changues applied
Almami679 Apr 30, 2025
5f15bab
Merge pull request #844 from IT-Academy-BCN/feature/252-Increase-solv…
ivilarop Apr 30, 2025
cb14ccd
Merge pull request #853 from IT-Academy-BCN/#270_Añadir_nuevo_status_…
ivilarop Apr 30, 2025
3b12851
added get all bookmarks from user endpoint
AlexandraBonetCanela Apr 28, 2025
41b3ca0
added get all bookmarks Service method
AlexandraBonetCanela Apr 28, 2025
caddfa6
added Tests for get all bookmarks endpoint controller method
AlexandraBonetCanela Apr 28, 2025
9f8536e
added tests for UserService getUserBookmarks method
AlexandraBonetCanela Apr 28, 2025
c04b05a
added issue 849 GET all bookmarked challenges endpoint to changelog
AlexandraBonetCanela Apr 28, 2025
d6bd5ae
Merge pull request #849 from IT-Academy-BCN/feature/255-get-user-book…
ivilarop Apr 30, 2025
4937e0d
fix: service method improved with custom exceptions
Sh1ng0 May 1, 2025
81f8b1f
Added tests for exceptions and changed the method for a more reactive…
Sh1ng0 May 1, 2025
0eabba7
added method addChallengeToSolved to UserInterface
May 4, 2025
33fb7dd
added method addChallengeToSolved to UserServiceImpl
May 4, 2025
1f52646
added method addChallengeToSolved to ChallengeInterface
May 4, 2025
5bfadc7
added method addChallengeToSolved to ChallengeServiceImpl
May 4, 2025
24231ee
added test for UserServiceImpl
May 4, 2025
7a83514
Refactorizado el manejo de ResourceNotFoundException en el Global Exc…
Sh1ng0 May 4, 2025
22a0440
added test for ChallengeServiceImpl
May 4, 2025
0c9cbb3
Merge branch 'develop' into feature/MarcBernabeu-onboarding
trisk910 May 5, 2025
1cbff04
Merge pull request #854 from IT-Academy-BCN/feature/MarcBernabeu-onbo…
ivilarop May 5, 2025
cac2690
applied requested changes
May 5, 2025
cab977a
Merge branch 'develop' into add-santiago-contributor
shernandez334 May 5, 2025
76ae09c
Add Toni Jimenez to contributors.md
tonijimenez72 Apr 30, 2025
880b824
Delete of unnecesary Autowired - AuthService
Apr 10, 2025
127a6a1
Merge pull request #855 from IT-Academy-BCN/feature/toni-jimenez-onbo…
ivilarop May 5, 2025
79713f1
Add Enric Vicente to contributors.md
EnricW Apr 30, 2025
c40f173
Merge pull request #856 from IT-Academy-BCN/feature/enricvicente-onbo…
ivilarop May 5, 2025
4abc9e2
fixed httpMethod addChallengeToSolved
May 5, 2025
4c655db
Add Ismael Peiró to contributors.md
IsmaPeiro Apr 30, 2025
2977ab6
Merge branch 'develop' into add-santiago-contributor
shernandez334 May 5, 2025
d77764d
Merge pull request #839 from IT-Academy-BCN/feature/240-Change-autowi…
ivilarop May 5, 2025
0051914
addChallengeToSolved mocked
May 5, 2025
e01e4c3
fixed imports
May 5, 2025
61220c9
Merge pull request #857 from IT-Academy-BCN/feature/ismael-peiro-onbo…
ivilarop May 5, 2025
41c1db5
new tests method mocked
May 5, 2025
02bb8a0
Merge branch 'develop' into add-santiago-contributor
shernandez334 May 5, 2025
429b27b
Update contributors.md
shernandez334 May 5, 2025
2eb22b5
Update contributors.md
shernandez334 May 5, 2025
3d55ab0
Merge pull request #860 from IT-Academy-BCN/feature/275-creation-meth…
ivilarop May 5, 2025
3ef3e89
Merge pull request #858 from IT-Academy-BCN/add-santiago-contributor
ivilarop May 5, 2025
aeb3557
add inga to contributrs
IngaD89 Apr 30, 2025
c67033f
added controller method
May 5, 2025
c953171
added new test solvedController
May 5, 2025
8379deb
Merge pull request #862 from IT-Academy-BCN/feature/277-creation-meth…
ivilarop May 5, 2025
362a4b3
Merge pull request #859 from IT-Academy-BCN/feature/inga-onboarding
ivilarop May 5, 2025
697a57c
[feat] Obtener recursos asociados a un challengeId (servicio + reposi…
Sh1ng0 Apr 28, 2025
86a3026
Eliminados comentarios innecesarios
Sh1ng0 Apr 29, 2025
8018102
feat: añadir controlador y tests para los recursos del reto
Sh1ng0 Apr 29, 2025
369c6ea
faltaba añadir la ruta del get
Sh1ng0 Apr 29, 2025
9d12e92
corrección de nomenclatura de ruta
Sh1ng0 Apr 29, 2025
c0a1483
Fix: updated ResourceControllerTest to match updated endpoint path
Sh1ng0 Apr 29, 2025
e98ceef
Added endpoint to changelog
Sh1ng0 Apr 29, 2025
bdf6cc4
fix: service method improved with custom exceptions
Sh1ng0 May 1, 2025
d90f483
Added tests for exceptions and changed the method for a more reactive…
Sh1ng0 May 1, 2025
962874a
Refactorizado el manejo de ResourceNotFoundException en el Global Exc…
Sh1ng0 May 4, 2025
52e43f7
Finalizado merge del changelog y resolución de conflictos
Sh1ng0 May 5, 2025
9db8e2e
Added 500 error response to Swagger documentation in ResourceController
Sh1ng0 May 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
## CHANGELOG

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

* Issue #852: Added GET endpoint in the Challenge Microservice to retrieve resources associated to a challenge
* Issue #849: Added GET endpoint to retrieve all User's bookmarked challenges.
* Issue #843: Added DELETE endpoint in the Challenge Microservice to unbookmark a challenge.
* Issue #843: Added DELETE endpoint in the Challenge Microservice to unbookmark a challenge.
* Issue #852: Added GET endpoint for retrieving resources from a challenge
* Issue #829: Added bookmark POST endpoint in the Challenge Microservice to bookmark a challenge.
* Issue #827: Added bookmark POST endpoint in the User Microservice to bookmark a challenge.
* Issue #831: Added DELETE endpoint for user's bookmals in User Microservice.
Expand Down
8 changes: 7 additions & 1 deletion contributors.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,10 @@
* Albert Marín Miranda - https://github.com/Almami679
* Alexandra Bonet - https://github.com/AlexandraBonetCanela
* Gwénaël Le Moing - https://github.com/g-lemoing
* Matías Meza - https://github.com/RustyGearBox
* Matías Meza - https://github.com/RustyGearBox
* Marc Bernabeu Rodriguez - https://github.com/trisk910
* Toni Jiménez - https://github.com/tonijimenez72
* Enric Vicente - https://github.com/EnricW
* Ismael Peiró - https://github.com/IsmaPeiro
* Santiago Hernandez Beltran - https://github.com/shernandez334
* Inga Demetrashvili - https://github.com/IngaD89
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -39,7 +38,6 @@ public class AuthService implements IAuthService {

private final String clientSecret;

@Autowired
public AuthService(WebClient.Builder webClientBuilder,
@Value("${spring.security.oauth2.client.provider.github.token-uri}") String githubTokenUri,
@Value("${spring.security.oauth2.client.provider.github.user-info-uri}") String githubUserInfoUri,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.itachallenge.challenge.controller;

import com.itachallenge.challenge.dto.SolvedDto;
import com.itachallenge.challenge.exception.BadRequestException;
import com.itachallenge.challenge.exception.JwtException;
import com.itachallenge.challenge.service.IChallengeService;
import com.itachallenge.challenge.service.IJwtService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import lombok.RequiredArgsConstructor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

@RestController
@Validated
@RequestMapping(value = "/itachallenge/api/v1/challenge")
@RequiredArgsConstructor
public class ChallengeSolvedController {

private static final Logger log = LoggerFactory.getLogger(ChallengeSolvedController.class);

private IChallengeService challengeService;
private IJwtService jwtService;

@PostMapping("/challenges/{challengeId}/solved")
@Operation(
operationId = "Add a challenge to User's solved challenges.",
summary = "Add a challenge to solved challenges.",
description = "The ID Challenge sent through the URI is added to the user's solved challenges. User Id is determined from the headers.",
responses = {
@ApiResponse(responseCode = "200", content = {@Content(schema = @Schema(implementation = SolvedDto.class), mediaType = "application/json")}),
@ApiResponse(responseCode = "400", description = "Missing or invalid authorization header."),
@ApiResponse(responseCode = "404", description = "The Challenge with given Id was not found."),
@ApiResponse(responseCode = "500", description = "Internal Server Error")
}
)
public Mono<ResponseEntity<SolvedDto>> addChallengeToSolved(
@PathVariable String challengeId,
@RequestHeader(name = "Authorization", required = false) String authHeader) {
return Mono.fromCallable(() -> jwtService.getUserUuIdFromAuthenticationHeader(authHeader))
.onErrorMap(JwtException.class, e -> new BadRequestException(e.getMessage()))
.flatMap(userId -> challengeService.addChallengeToSolved(challengeId, userId))
.doOnError(error -> log.error("Error adding challenge to solved: {}", error.getMessage()))
.map(ResponseEntity::ok);
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
package com.itachallenge.challenge.controller;
import com.itachallenge.challenge.dto.ResourceDto;

import com.itachallenge.challenge.service.IResourceService;
import io.swagger.v3.oas.annotations.Operation;

import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.UUID;

@RestController
@Validated
@RequestMapping(value = "/itachallenge/api/v1/resource")
Expand Down Expand Up @@ -41,5 +51,18 @@ public Mono<ResponseEntity<ResourceDto>> createNewResource(@RequestBody @Valid R
return resourceService.createResource(resourceDto)
.map(createdResource -> ResponseEntity.ok().body(createdResource));
}


@GetMapping("/challenge/{challengeId}")
@Operation(summary = "Get resources by challenge ID")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Resources found"),
@ApiResponse(responseCode = "400", description = "Invalid challenge ID"),
@ApiResponse(responseCode = "404", description = "No resources found"),
@ApiResponse(responseCode = "500", description = "Internal Server Error")
})
public Flux<ResourceDto> getResourcesByChallengeId(@PathVariable UUID challengeId) {
return resourceService.getResourcesByChallengeId(challengeId);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ public class ChallengeDocument {
@Field(name="times_bookmark")
private Integer timesBookmark;

@Field(name="times_solved")
private Integer timesSolved;

@Field(name = "tags")
private List<UUID> tags;

Expand Down Expand Up @@ -80,5 +83,10 @@ public void increaseTimesBookmark() {
public void decreaseTimesBookmark() {
timesBookmark =Integer.max(timesBookmark == null ? 0 : timesBookmark - 1, 0);
}

public void increaseTimesSolved() {
timesSolved = timesSolved == null ? 1 : timesSolved + 1;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,8 @@ public class ChallengeDto {

@JsonProperty(index = 11)
private Integer timesBookmark;

@JsonProperty(index = 12)
private Integer timesSolved;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.itachallenge.challenge.dto;

import lombok.*;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class SolvedDto {

private boolean isSolved;

private int timesSolved;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@

public enum UserChallengeActionType {
BOOKMARKS,
FAVORITES
FAVORITES,
SOLVED
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public ResponseEntity<MessageDto> handleChallengeNotFoundReturn404Exception(Chal

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<MessageDto> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.ok().body(new MessageDto(ex.getMessage()));
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new MessageDto(ex.getMessage()));
}

@ExceptionHandler(LanguageNotFoundException.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ protected String convert(LocalDateTime creationDateFromDocument) {
.addMapping(ChallengeDocument::getTitle, ChallengeDto::setTitle)
.addMapping(ChallengeDocument::getTimesFavorite, ChallengeDto::setTimesFavorite)
.addMapping(ChallengeDocument::getTags, ChallengeDto::setTags)
.addMapping(ChallengeDocument::getTimesBookmark, ChallengeDto::setTimesBookmark);
.addMapping(ChallengeDocument::getTimesBookmark, ChallengeDto::setTimesBookmark)
.addMapping(ChallengeDocument::getTimesSolved, ChallengeDto::setTimesSolved);
mapper.addConverter(converterFromLocalDateTimeToString);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ public interface ResourceRepository extends ReactiveSortingRepository<ResourceDo
Flux<ResourceDocument> saveAll(Flux<ResourceDocument> resourceDocumentFlux);
Mono<Void> deleteAll();

Flux<ResourceDocument> findByChallengeIdsContaining(UUID challengeId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -448,5 +448,33 @@ public Mono<BookmarkDto> removeChallengeFromBookmarks(String challengeId, String
});
}

@Override
public Mono<SolvedDto> addChallengeToSolved(String challengeId, String userId) {
Mono<UUID> challengeIdMono = validateUUID(challengeId);
Mono<UUID> userIdMono = validateUUID(userId);

return Mono.zip(challengeIdMono, userIdMono)
.flatMap(uuidTuple -> {
UUID challengeUuid = uuidTuple.getT1();
UUID userUuid = uuidTuple.getT2();

return challengeRepository.findByUuid(challengeUuid)
.switchIfEmpty(Mono.error(new ChallengeNotFoundReturn404Exception(
String.format(CHALLENGE_NOT_FOUND_ERROR, challengeUuid))))
.flatMap(challenge -> {
log.info("It should be connected to user service using the fields {} and {}", challengeUuid, userUuid);

//The part of the user service is not implemented yet, it should be connected to the user service in the future.

if (Optional.ofNullable(challenge.getTimesSolved()).orElse(0) == 0) {
challenge.increaseTimesSolved();
return challengeRepository.save(challenge);
}

return Mono.just(challenge);
})
.map(updatedChallenge -> new SolvedDto(true, updatedChallenge.getTimesSolved()));
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,6 @@ Flux<GenericResultDto<ChallengeDto>> getChallengesByFilter(Optional<String> idLa
Mono<FavoriteDto> removeChallengeFromFavorites(String challengeId, String userId);

Mono<BookmarkDto> removeChallengeFromBookmarks(String challengeId, String userId);

Mono<SolvedDto> addChallengeToSolved(String challengeId, String userId);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.itachallenge.challenge.service;

import com.itachallenge.challenge.dto.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.UUID;


public interface IResourceService {
Mono<ResourceDto> createResource(ResourceDto resourceDto);

Flux<ResourceDto> getResourcesByChallengeId(UUID challengeId);
}

Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public interface IUserService {
Mono<Boolean> removeChallengeFromFavorites(String userId, String challengeId);

Mono<Boolean> removeChallengeFromBookmarks(String userId, String challengeId);

Mono<Boolean> addChallengeToSolved(String userId, String challengeId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@
import com.itachallenge.challenge.dto.ResourceDto;
import com.itachallenge.challenge.enums.AssociationType;
import com.itachallenge.challenge.enums.Topic;
import com.itachallenge.challenge.exception.BadRequestException;
import com.itachallenge.challenge.exception.InternalServerErrorException;
import com.itachallenge.challenge.exception.ResourceNotFoundException;
import com.itachallenge.challenge.helper.DocumentToDtoConverter;
import com.itachallenge.challenge.repository.ResourceRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.*;
Expand Down Expand Up @@ -135,4 +139,22 @@ private Mono<ResourceDto> saveResource(ResourceDto resourceDto) {
})
.doOnError(error -> log.error("Error occurred when creating resource {}", error.getMessage()));
}


public Flux<ResourceDto> getResourcesByChallengeId(UUID challengeId) {
return Mono.justOrEmpty(challengeId)
.switchIfEmpty(Mono.error(new BadRequestException("Challenge ID cannot be null")))
.flatMapMany(validChallengeId ->
resourceRepository.findByChallengeIdsContaining(validChallengeId)
.switchIfEmpty(Mono.error(new ResourceNotFoundException("No resources found for challenge ID: " + validChallengeId))) // Lanzar 404 si no se encuentra nada
.map(resourceDoc -> resourceConverter.convertDocumentToDto(resourceDoc, ResourceDto.class))
.onErrorResume(error -> {
log.error("Error fetching resources for challenge ID {}: {}", validChallengeId, error.getMessage());
if (error instanceof ResourceNotFoundException) {
return Flux.error(error);
}
return Flux.error(new InternalServerErrorException("Failed to fetch resources for challenge ID: " + validChallengeId));
})
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class UserServiceImpl implements IUserService {
private final String userServiceUrl;
private final String X_FAVORITE_MESSAGE = "X-Favorite-Message";
private final String X_BOOKMARK_MESSAGE = "X-Bookmark-Message";
private final String X_SOLVED_MESSAGE = "X-Solved-Message";

public UserServiceImpl(
WebClient.Builder webClientBuilder,
Expand All @@ -42,6 +43,11 @@ public Mono<Boolean> addChallengeToBookmarks(String userId, String challengeId)
return callEndpoint(userId, challengeId, UserChallengeActionType.BOOKMARKS, X_BOOKMARK_MESSAGE, HttpMethod.POST);
}

@Override
public Mono<Boolean> addChallengeToSolved(String userId, String challengeId) {
return callEndpoint(userId, challengeId, UserChallengeActionType.SOLVED, X_SOLVED_MESSAGE, HttpMethod.POST);
}

@Override
public Mono<Boolean> removeChallengeFromFavorites(String userId, String challengeId) {
return callEndpoint(userId, challengeId, UserChallengeActionType.FAVORITES, X_FAVORITE_MESSAGE, HttpMethod.DELETE);
Expand Down
Loading
Loading