upgrade spring, add javadoc, formatting
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
<dependency>
|
||||
<groupId>com.nimbusds</groupId>
|
||||
<artifactId>nimbus-jose-jwt</artifactId>
|
||||
<version>9.21</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -117,8 +117,8 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
* @return the page
|
||||
*/
|
||||
public Page<JitsiRoom> get(int page, int size, String sortBy, boolean descending) {
|
||||
return jitsiRoomRepository.findAll(PageRequest.of(page, size,
|
||||
descending ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending()));
|
||||
return jitsiRoomRepository.findAll(
|
||||
PageRequest.of(page, size, descending ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,14 +131,13 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
* @param descending the descending
|
||||
* @return the for user id
|
||||
*/
|
||||
public Page<JitsiRoom> getForUserId(Long userId, int page, int size, String sortBy,
|
||||
boolean descending) {
|
||||
public Page<JitsiRoom> getForUserId(Long userId, int page, int size, String sortBy, boolean descending) {
|
||||
// delete expired rooms
|
||||
jitsiRoomRepository.deleteAll(jitsiRoomRepository.findAll(
|
||||
qJitsiRoom.owner.eq(userId).and(qJitsiRoom.expires.before(Instant.now()))));
|
||||
jitsiRoomRepository.deleteAll(
|
||||
jitsiRoomRepository.findAll(qJitsiRoom.owner.eq(userId).and(qJitsiRoom.expires.before(Instant.now()))));
|
||||
|
||||
return jitsiRoomRepository.findAll(qJitsiRoom.owner.eq(userId), PageRequest.of(page, size,
|
||||
descending ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending()));
|
||||
return jitsiRoomRepository.findAll(qJitsiRoom.owner.eq(userId),
|
||||
PageRequest.of(page, size, descending ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,8 +151,8 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
* @return the jitsi room
|
||||
* @throws JOSEException the JOSE exception
|
||||
*/
|
||||
public JitsiRoom create(Long owner, String room, Instant starts, Instant moderationStarts,
|
||||
Instant expires) throws JOSEException {
|
||||
public JitsiRoom create(Long owner, String room, Instant starts, Instant moderationStarts, Instant expires)
|
||||
throws JOSEException {
|
||||
JitsiRoom jitsiRoom = new JitsiRoom();
|
||||
jitsiRoom.setOwner(owner);
|
||||
jitsiRoom.setRoom(room);
|
||||
@@ -190,8 +189,7 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
bodyBuilder.notBeforeTime(Date.from(jitsiRoom.getStarts()));
|
||||
}
|
||||
|
||||
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT)
|
||||
.build();
|
||||
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();
|
||||
|
||||
SignedJWT token = new SignedJWT(jwsHeader, bodyBuilder.build());
|
||||
token.sign(signer);
|
||||
@@ -206,15 +204,13 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
jitsiRoom.setModerationToken(moderationToken.serialize());
|
||||
|
||||
jitsiRoom.setUrl(String.format(urlFormat, jitsiRoom.getRoom(), jitsiRoom.getToken()));
|
||||
jitsiRoom.setModerationUrl(
|
||||
String.format(urlFormat, jitsiRoom.getRoom(), jitsiRoom.getModerationToken()));
|
||||
jitsiRoom.setModerationUrl(String.format(urlFormat, jitsiRoom.getRoom(), jitsiRoom.getModerationToken()));
|
||||
|
||||
if (StringUtils.hasText(jitsiRoom.getCode())) {
|
||||
ShortenedUrl shortenedUrl = shortenedUrlManager.get(jitsiRoom.getCode());
|
||||
if (shortenedUrl != null) {
|
||||
shortenedUrl.setUrl(jitsiRoom.getUrl());
|
||||
shortenedUrl.setNote("JitsiRoom: "
|
||||
+ jitsiRoom.getRoom());
|
||||
shortenedUrl.setNote("JitsiRoom: " + jitsiRoom.getRoom());
|
||||
shortenedUrl.setExpires(jitsiRoom.getExpires());
|
||||
shortenedUrlManager.save(shortenedUrl);
|
||||
jitsiRoom.setOrgUrl(jitsiRoom.getUrl());
|
||||
@@ -234,10 +230,8 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
* @return the jitsi room
|
||||
*/
|
||||
public JitsiRoom createShortenedUrl(JitsiRoom jitsiRoom) {
|
||||
ShortenedUrl shortenedUrl = shortenedUrlManager.create(jitsiRoom.getOwner(),
|
||||
jitsiRoom.getUrl(), "JitsiRoom: "
|
||||
+ jitsiRoom.getRoom(),
|
||||
null, jitsiRoom.getExpires(), null, false, true);
|
||||
ShortenedUrl shortenedUrl = shortenedUrlManager.create(jitsiRoom.getOwner(), jitsiRoom.getUrl(),
|
||||
"JitsiRoom: " + jitsiRoom.getRoom(), null, jitsiRoom.getExpires(), null, false, true);
|
||||
jitsiRoom.setOrgUrl(jitsiRoom.getUrl());
|
||||
jitsiRoom.setCode(shortenedUrl.getCode());
|
||||
jitsiRoom.setUrl(shortenedUrl.getLink());
|
||||
@@ -254,8 +248,7 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
if (quota) {
|
||||
Quota jitsiRoomsQuota = quotaManager.get(jitsiRoom.getOwner(), JitsiQuotas.JITSI_MEET);
|
||||
if (jitsiRoomsQuota == null) {
|
||||
jitsiRoomsQuota = quotaManager.create(jitsiRoom.getOwner(), JitsiQuotas.JITSI_MEET,
|
||||
0, "#", true);
|
||||
jitsiRoomsQuota = quotaManager.create(jitsiRoom.getOwner(), JitsiQuotas.JITSI_MEET, 0, "#", true);
|
||||
}
|
||||
|
||||
jitsiRoomsQuota.setValue(jitsiRoomsQuota.getValue() + 1);
|
||||
@@ -263,8 +256,8 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
}
|
||||
|
||||
if (StringUtils.hasText(jitsiRoom.getCode())) {
|
||||
ShortenedUrl shortenedUrl = shortenedUrlRepository
|
||||
.findOne(qShortenedUrl.code.eq(jitsiRoom.getCode())).orElse(null);
|
||||
ShortenedUrl shortenedUrl = shortenedUrlRepository.findOne(qShortenedUrl.code.eq(jitsiRoom.getCode()))
|
||||
.orElse(null);
|
||||
if (shortenedUrl != null) {
|
||||
if (quota) {
|
||||
Quota shortenedUrlsQuota = quotaManager.get(shortenedUrl.getOwner(),
|
||||
@@ -293,8 +286,7 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
* @param quota the quota
|
||||
*/
|
||||
public void deleteAll(Long owner, boolean quota) {
|
||||
List<JitsiRoom> jitsiRooms = Lists
|
||||
.newArrayList(jitsiRoomRepository.findAll(qJitsiRoom.owner.eq(owner)));
|
||||
List<JitsiRoom> jitsiRooms = Lists.newArrayList(jitsiRoomRepository.findAll(qJitsiRoom.owner.eq(owner)));
|
||||
|
||||
for (JitsiRoom jitsiRoom : jitsiRooms) {
|
||||
delete(jitsiRoom, quota);
|
||||
@@ -336,7 +328,6 @@ public class JitsiRoomManager implements SmartInitializingSingleton, UserDataPro
|
||||
*/
|
||||
@Scheduled(cron = "0 */5 * * * *")
|
||||
protected void clearExpiredRooms() {
|
||||
jitsiRoomRepository
|
||||
.deleteAll(jitsiRoomRepository.findAll(qJitsiRoom.expires.before(Instant.now())));
|
||||
jitsiRoomRepository.deleteAll(jitsiRoomRepository.findAll(qJitsiRoom.expires.before(Instant.now())));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,9 +25,9 @@ public class UrlShortenerSync implements ApplicationListener<AbstractModelEvent>
|
||||
private JitsiRoomRepository jitsiRoomRepository;
|
||||
private QJitsiRoom qJitsiRoom = QJitsiRoom.jitsiRoom;
|
||||
|
||||
|
||||
/*
|
||||
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
|
||||
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.
|
||||
* springframework.context.ApplicationEvent)
|
||||
*/
|
||||
@Override
|
||||
public void onApplicationEvent(AbstractModelEvent event) {
|
||||
@@ -35,8 +35,8 @@ public class UrlShortenerSync implements ApplicationListener<AbstractModelEvent>
|
||||
if (AbstractModelEventType.PRE_REMOVE.equals(event.getType())) {
|
||||
ShortenedUrl shortenedUrl = (ShortenedUrl) event.getModel();
|
||||
|
||||
JitsiRoom jitsiRoom = jitsiRoomRepository
|
||||
.findOne(qJitsiRoom.code.eq(shortenedUrl.getCode())).orElse(null);
|
||||
JitsiRoom jitsiRoom = jitsiRoomRepository.findOne(qJitsiRoom.code.eq(shortenedUrl.getCode()))
|
||||
.orElse(null);
|
||||
if (jitsiRoom != null) {
|
||||
jitsiRoom.setUrl(jitsiRoom.getOrgUrl());
|
||||
jitsiRoom.setCode(null);
|
||||
@@ -45,8 +45,8 @@ public class UrlShortenerSync implements ApplicationListener<AbstractModelEvent>
|
||||
}
|
||||
} else if (AbstractModelEventType.POST_UPDATE.equals(event.getType())) {
|
||||
ShortenedUrl shortenedUrl = (ShortenedUrl) event.getModel();
|
||||
JitsiRoom jitsiRoom = jitsiRoomRepository
|
||||
.findOne(qJitsiRoom.code.eq(shortenedUrl.getCode())).orElse(null);
|
||||
JitsiRoom jitsiRoom = jitsiRoomRepository.findOne(qJitsiRoom.code.eq(shortenedUrl.getCode()))
|
||||
.orElse(null);
|
||||
if (jitsiRoom != null) {
|
||||
if (!StringUtils.hasText(jitsiRoom.getOrgUrl())) {
|
||||
jitsiRoom.setOrgUrl(jitsiRoom.getUrl());
|
||||
|
||||
@@ -65,16 +65,15 @@ public class JitsiRoomController extends BaseController {
|
||||
@PreAuthorize("isAuthenticated()")
|
||||
@GetMapping
|
||||
public Page<JitsiRoom> getJitsiRooms(@RequestParam("page") Optional<Integer> pageParameter,
|
||||
@RequestParam("size") Optional<Integer> sizeParameter,
|
||||
@RequestParam("sort") Optional<String> sortParameter,
|
||||
@RequestParam("size") Optional<Integer> sizeParameter, @RequestParam("sort") Optional<String> sortParameter,
|
||||
@RequestParam("desc") Optional<Boolean> descParameter) {
|
||||
if (!permissionManager.hasPermission(getCurrentUserId(), JitsiPermissions.JITSI_MEET)) {
|
||||
jitsiRoomManager.deleteAll(getCurrentUserId(), false);
|
||||
throw new EntityResponseStatusException(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
return jitsiRoomManager.getForUserId(getCurrentUserId(), pageParameter.orElse(0),
|
||||
sizeParameter.orElse(10), sortParameter.orElse("id"), descParameter.orElse(false));
|
||||
return jitsiRoomManager.getForUserId(getCurrentUserId(), pageParameter.orElse(0), sizeParameter.orElse(10),
|
||||
sortParameter.orElse("id"), descParameter.orElse(false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,7 +105,7 @@ public class JitsiRoomController extends BaseController {
|
||||
} else {
|
||||
jitsiRoomValidator.validate(jitsiRoom, errors);
|
||||
}
|
||||
|
||||
|
||||
if (errors.hasErrors()) {
|
||||
throw new EntityResponseStatusException(errors.getAllErrors(), HttpStatus.CONFLICT);
|
||||
}
|
||||
@@ -115,8 +114,8 @@ public class JitsiRoomController extends BaseController {
|
||||
jitsiRoomsQuota = quotaManager.update(jitsiRoomsQuota);
|
||||
|
||||
try {
|
||||
return jitsiRoomManager.create(jitsiRoom.getOwner(), jitsiRoom.getRoom(),
|
||||
jitsiRoom.getStarts(), jitsiRoom.getModerationStarts(), jitsiRoom.getExpires());
|
||||
return jitsiRoomManager.create(jitsiRoom.getOwner(), jitsiRoom.getRoom(), jitsiRoom.getStarts(),
|
||||
jitsiRoom.getModerationStarts(), jitsiRoom.getExpires());
|
||||
} catch (JOSEException e) {
|
||||
jitsiRoomsQuota.setValue(jitsiRoomsQuota.getValue() - 1);
|
||||
jitsiRoomsQuota = quotaManager.update(jitsiRoomsQuota);
|
||||
@@ -182,14 +181,12 @@ public class JitsiRoomController extends BaseController {
|
||||
throw new EntityResponseStatusException(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
if (!permissionManager.hasPermission(getCurrentUserId(),
|
||||
ShortenedUrlPermissions.URL_SHORTENER)
|
||||
if (!permissionManager.hasPermission(getCurrentUserId(), ShortenedUrlPermissions.URL_SHORTENER)
|
||||
|| !permissionManager.isFullUser(getCurrentUserId())) {
|
||||
throw new EntityResponseStatusException(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
Quota shortenedUrlsQuota = quotaManager.get(getCurrentUserId(),
|
||||
ShortenedUrlQuotas.URL_SHORTENER);
|
||||
Quota shortenedUrlsQuota = quotaManager.get(getCurrentUserId(), ShortenedUrlQuotas.URL_SHORTENER);
|
||||
if (shortenedUrlsQuota == null || shortenedUrlsQuota.getValue() < 1) {
|
||||
throw new EntityResponseStatusException(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@@ -80,13 +80,12 @@ public class JitsiRoomManagementController extends BaseController {
|
||||
/**
|
||||
* Delete jitsi room.
|
||||
*
|
||||
* @param id the id
|
||||
* @param id the id
|
||||
* @param quota the quota
|
||||
*/
|
||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||
@DeleteMapping("/{id}")
|
||||
public void deleteJitsiRoom(@PathVariable("id") Long id,
|
||||
@RequestParam("quota") Optional<Boolean> quota) {
|
||||
public void deleteJitsiRoom(@PathVariable("id") Long id, @RequestParam("quota") Optional<Boolean> quota) {
|
||||
|
||||
JitsiRoom jitsiRoom = jitsiRoomManager.get(id);
|
||||
if (jitsiRoom == null) {
|
||||
@@ -104,8 +103,7 @@ public class JitsiRoomManagementController extends BaseController {
|
||||
*/
|
||||
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||
@DeleteMapping("/all/{owner}")
|
||||
public void deleteAll(@PathVariable("owner") Long owner,
|
||||
@RequestParam("quota") Optional<Boolean> quota) {
|
||||
public void deleteAll(@PathVariable("owner") Long owner, @RequestParam("quota") Optional<Boolean> quota) {
|
||||
jitsiRoomManager.deleteAll(owner, quota.isPresent() && quota.get().booleanValue());
|
||||
}
|
||||
|
||||
|
||||
+27
-33
@@ -67,9 +67,9 @@ public class JitsiRoomValidator implements Validator {
|
||||
/**
|
||||
* Validate.
|
||||
*
|
||||
* @param owner the owner
|
||||
* @param owner the owner
|
||||
* @param roomName the room name
|
||||
* @param errors the errors
|
||||
* @param errors the errors
|
||||
*/
|
||||
public void validate(Long owner, String roomName, Errors errors) {
|
||||
if (owner == null) {
|
||||
@@ -97,14 +97,12 @@ public class JitsiRoomValidator implements Validator {
|
||||
* Validate room.
|
||||
*
|
||||
* @param roomName the room name
|
||||
* @param errors the errors
|
||||
* @param errors the errors
|
||||
*/
|
||||
public void validateRoom(String roomName, Errors errors) {
|
||||
for (String systemRoomName : systemPropertyManager.get(RESERVED_JITSI_ROOMS, "")
|
||||
.split(",")) {
|
||||
if (StringUtils.hasText(systemRoomName)
|
||||
&& (roomName.toLowerCase().equals(systemRoomName)
|
||||
|| roomName.toLowerCase().matches(systemRoomName))) {
|
||||
for (String systemRoomName : systemPropertyManager.get(RESERVED_JITSI_ROOMS, "").split(",")) {
|
||||
if (StringUtils.hasText(systemRoomName) && (roomName.toLowerCase().equals(systemRoomName)
|
||||
|| roomName.toLowerCase().matches(systemRoomName))) {
|
||||
errors.rejectValue("room", "NOT_VALID");
|
||||
return;
|
||||
}
|
||||
@@ -115,7 +113,7 @@ public class JitsiRoomValidator implements Validator {
|
||||
* Validate expiry.
|
||||
*
|
||||
* @param jitsiRoom the jitsi room
|
||||
* @param errors the errors
|
||||
* @param errors the errors
|
||||
*/
|
||||
public void validateExpiry(JitsiRoom jitsiRoom, Errors errors) {
|
||||
|
||||
@@ -124,13 +122,11 @@ public class JitsiRoomValidator implements Validator {
|
||||
}
|
||||
|
||||
if (jitsiRoom.getModerationStarts() != null) {
|
||||
jitsiRoom.setModerationStarts(
|
||||
InstantHelper.truncate(jitsiRoom.getModerationStarts(), ChronoUnit.SECONDS));
|
||||
jitsiRoom.setModerationStarts(InstantHelper.truncate(jitsiRoom.getModerationStarts(), ChronoUnit.SECONDS));
|
||||
}
|
||||
|
||||
if (jitsiRoom.getExpires() != null) {
|
||||
jitsiRoom
|
||||
.setExpires(InstantHelper.truncate(jitsiRoom.getExpires(), ChronoUnit.SECONDS));
|
||||
jitsiRoom.setExpires(InstantHelper.truncate(jitsiRoom.getExpires(), ChronoUnit.SECONDS));
|
||||
}
|
||||
|
||||
// no moderation start without start
|
||||
@@ -151,8 +147,7 @@ public class JitsiRoomValidator implements Validator {
|
||||
// exlude self
|
||||
.and(qJitsiRoom.id.ne(jitsiRoom.getId() == null ? -1L : jitsiRoom.getId()))
|
||||
// expires null or after now
|
||||
.and(qJitsiRoom.expires.isNull()
|
||||
.or(qJitsiRoom.expires.after(Instant.now()))))) {
|
||||
.and(qJitsiRoom.expires.isNull().or(qJitsiRoom.expires.after(Instant.now()))))) {
|
||||
errors.rejectValue("room", "NOT_VALID");
|
||||
}
|
||||
} else
|
||||
@@ -164,8 +159,7 @@ public class JitsiRoomValidator implements Validator {
|
||||
// expires null or after now
|
||||
.and(qJitsiRoom.expires.isNull().or(qJitsiRoom.expires.after(Instant.now())))
|
||||
// start null or before expires
|
||||
.and(qJitsiRoom.starts.isNull()
|
||||
.or(qJitsiRoom.starts.before(jitsiRoom.getExpires()))))) {
|
||||
.and(qJitsiRoom.starts.isNull().or(qJitsiRoom.starts.before(jitsiRoom.getExpires()))))) {
|
||||
errors.rejectValue("expires", "NOT_VALID");
|
||||
}
|
||||
}
|
||||
@@ -176,27 +170,27 @@ public class JitsiRoomValidator implements Validator {
|
||||
.and(qJitsiRoom.id.ne(jitsiRoom.getId() == null ? -1L : jitsiRoom.getId()))
|
||||
// expires null or after room start
|
||||
.and(qJitsiRoom.expires.isNull()
|
||||
.or(qJitsiRoom.expires.after(jitsiRoom.getModerationStarts() != null
|
||||
? jitsiRoom.getModerationStarts()
|
||||
: jitsiRoom.getStarts()))))) {
|
||||
.or(qJitsiRoom.expires
|
||||
.after(jitsiRoom.getModerationStarts() != null ? jitsiRoom.getModerationStarts()
|
||||
: jitsiRoom.getStarts()))))) {
|
||||
errors.rejectValue("starts", "NOT_VALID");
|
||||
}
|
||||
} else
|
||||
// expiry + start
|
||||
if (jitsiRoom.getExpires() != null && jitsiRoom.getStarts() != null) {
|
||||
if (jitsiRoom.getStarts().isAfter(jitsiRoom.getExpires())
|
||||
|| jitsiRoomRepository.exists(qJitsiRoom.room.eq(jitsiRoom.getRoom())
|
||||
// exlude self
|
||||
.and(qJitsiRoom.id
|
||||
.ne(jitsiRoom.getId() == null ? -1L : jitsiRoom.getId()))
|
||||
// expires null or after room start
|
||||
.and(qJitsiRoom.expires.isNull().or(
|
||||
qJitsiRoom.expires.after(jitsiRoom.getModerationStarts() != null
|
||||
? jitsiRoom.getModerationStarts()
|
||||
: jitsiRoom.getStarts())))
|
||||
// start null or before expires
|
||||
.and(qJitsiRoom.starts.isNull()
|
||||
.or(qJitsiRoom.starts.before(jitsiRoom.getExpires()))))) {
|
||||
if (jitsiRoom.getStarts().isAfter(jitsiRoom
|
||||
.getExpires()) || jitsiRoomRepository.exists(
|
||||
qJitsiRoom.room.eq(jitsiRoom.getRoom())
|
||||
// exlude self
|
||||
.and(qJitsiRoom.id.ne(jitsiRoom.getId() == null ? -1L : jitsiRoom.getId()))
|
||||
// expires null or after room start
|
||||
.and(qJitsiRoom.expires.isNull()
|
||||
.or(qJitsiRoom.expires.after(jitsiRoom.getModerationStarts() != null
|
||||
? jitsiRoom.getModerationStarts()
|
||||
: jitsiRoom.getStarts())))
|
||||
// start null or before expires
|
||||
.and(qJitsiRoom.starts.isNull()
|
||||
.or(qJitsiRoom.starts.before(jitsiRoom.getExpires()))))) {
|
||||
errors.rejectValue("starts", "NOT_VALID");
|
||||
errors.rejectValue("expires", "NOT_VALID");
|
||||
}
|
||||
|
||||
@@ -13,6 +13,5 @@ import de.bstly.we.jitsi.model.JitsiRoom;
|
||||
* The Interface JitsiRoomRepository.
|
||||
*/
|
||||
@Repository
|
||||
public interface JitsiRoomRepository
|
||||
extends JpaRepository<JitsiRoom, Long>, QuerydslPredicateExecutor<JitsiRoom> {
|
||||
public interface JitsiRoomRepository extends JpaRepository<JitsiRoom, Long>, QuerydslPredicateExecutor<JitsiRoom> {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user