Skip to content

Commit 44b6915

Browse files
committed
Optimize code and add tests
Signed-off-by: sdimitrov9 <stoyan.dimitrov@limechain.tech>
1 parent 102a9c9 commit 44b6915

10 files changed

Lines changed: 82 additions & 36 deletions

File tree

rest-java/src/main/java/org/hiero/mirror/restjava/common/Constants.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@
77
@UtilityClass
88
public class Constants {
99

10+
// Parameter names
1011
public static final String ACCOUNT_ID = "account.id";
11-
public static final String DEFAULT_LIMIT = "25";
1212
public static final String HOOK_ID = "hook.id";
1313
public static final String RECEIVER_ID = "receiver.id";
1414
public static final String SENDER_ID = "sender.id";
1515
public static final String SERIAL_NUMBER = "serialnumber";
1616
public static final String TIMESTAMP = "timestamp";
1717
public static final String TOKEN_ID = "token.id";
1818

19+
// Defaults and constraints
20+
public static final String DEFAULT_LIMIT = "25";
1921
public static final int MAX_LIMIT = 100;
2022
public static final int MAX_REPEATED_QUERY_PARAMETERS = 100;
2123
}

rest-java/src/main/java/org/hiero/mirror/restjava/controller/HooksController.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ final class HooksController {
4949
@GetMapping("/{accountId}/hooks")
5050
ResponseEntity<HooksResponse> getHooks(
5151
@PathVariable EntityIdParameter accountId,
52-
@RequestParam(name = "hook.id", required = false) @Size(max = MAX_REPEATED_QUERY_PARAMETERS)
52+
@RequestParam(name = HOOK_ID, required = false) @Size(max = MAX_REPEATED_QUERY_PARAMETERS)
5353
NumberRangeParameter[] hookIds,
5454
@RequestParam(defaultValue = DEFAULT_LIMIT) @Positive @Max(MAX_LIMIT) int limit,
5555
@RequestParam(defaultValue = "desc") Sort.Direction order) {
5656

5757
final var hookIdBound = new Bound(hookIds, true, HOOK_ID, HOOK.HOOK_ID);
5858

5959
final var hooksRequest = HooksRequest.builder()
60-
.accountId(accountId)
60+
.ownerId(accountId)
6161
.hookIds(hookIdBound)
6262
.limit(limit)
6363
.order(order)
@@ -68,12 +68,11 @@ ResponseEntity<HooksResponse> getHooks(
6868
final var hooksResponse = new HooksResponse();
6969
hooksResponse.setHooks(hooks);
7070

71-
if (!hooks.isEmpty() && hooks.size() == limit) {
72-
final var sort = Sort.by(order, HOOK_ID);
73-
final var pageable = PageRequest.of(0, limit, sort);
74-
final var links = linkFactory.create(hooks, pageable, EXTRACTOR);
75-
hooksResponse.setLinks(links);
76-
}
71+
final var sort = Sort.by(order, HOOK_ID);
72+
final var pageable = PageRequest.of(0, limit, sort);
73+
final var links = linkFactory.create(hooks, pageable, EXTRACTOR);
74+
hooksResponse.setLinks(links);
75+
7776
return ResponseEntity.ok(hooksResponse);
7877
}
7978
}

rest-java/src/main/java/org/hiero/mirror/restjava/dto/HooksRequest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@
44

55
import java.util.List;
66
import lombok.Builder;
7-
import lombok.Data;
7+
import lombok.Value;
88
import org.hiero.mirror.restjava.common.EntityIdParameter;
99
import org.hiero.mirror.restjava.service.Bound;
1010
import org.springframework.data.domain.Sort;
1111
import org.springframework.data.domain.Sort.Direction;
1212

13-
@Data
13+
@Value
1414
@Builder
1515
public class HooksRequest {
16-
private EntityIdParameter accountId;
16+
EntityIdParameter ownerId;
1717

1818
@Builder.Default
19-
private int limit = 25;
19+
int limit = 25;
2020

2121
@Builder.Default
22-
private Sort.Direction order = Direction.DESC;
22+
Sort.Direction order = Direction.DESC;
2323

2424
@Builder.Default
25-
private Bound hookIds = Bound.EMPTY;
25+
Bound hookIds = Bound.EMPTY;
2626

2727
public List<Bound> getBounds() {
2828
return hookIds.isEmpty() ? List.of() : List.of(hookIds);

rest-java/src/main/java/org/hiero/mirror/restjava/mapper/CommonMapper.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,19 @@ default TimestampRange mapRange(Range<Long> source) {
117117
}
118118

119119
default TimestampRangeNullable mapTimestampRangeNullable(Range<Long> source) {
120-
final var timestampRange = mapRange(source);
121-
if (timestampRange == null) {
120+
if (source == null) {
122121
return null;
123122
}
124123

125-
final var target = new TimestampRangeNullable();
126-
target.setFrom(timestampRange.getFrom());
127-
target.setTo(timestampRange.getTo());
124+
var target = new TimestampRangeNullable();
125+
if (source.hasLowerBound()) {
126+
target.setFrom(mapTimestamp(source.lowerEndpoint()));
127+
}
128+
129+
if (source.hasUpperBound()) {
130+
target.setTo(mapTimestamp(source.upperEndpoint()));
131+
}
132+
128133
return target;
129134
}
130135

rest-java/src/main/java/org/hiero/mirror/restjava/repository/HookRepositoryCustom.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
package org.hiero.mirror.restjava.repository;
44

5-
import jakarta.validation.constraints.NotNull;
65
import java.util.Collection;
76
import org.hiero.mirror.common.domain.entity.EntityId;
87
import org.hiero.mirror.common.domain.hook.Hook;
98
import org.hiero.mirror.restjava.dto.HooksRequest;
109

1110
public interface HookRepositoryCustom extends JooqRepository {
1211

13-
@NotNull
1412
Collection<Hook> findAll(HooksRequest request, EntityId accountId);
1513
}

rest-java/src/main/java/org/hiero/mirror/restjava/repository/HookRepositoryCustomImpl.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
package org.hiero.mirror.restjava.repository;
44

5-
import static org.hiero.mirror.restjava.common.RangeOperator.EQ;
65
import static org.hiero.mirror.restjava.jooq.domain.Tables.HOOK;
76

87
import jakarta.inject.Named;
@@ -11,14 +10,14 @@
1110
import org.hiero.mirror.common.domain.entity.EntityId;
1211
import org.hiero.mirror.common.domain.hook.Hook;
1312
import org.hiero.mirror.restjava.dto.HooksRequest;
14-
import org.jooq.Condition;
1513
import org.jooq.DSLContext;
16-
import org.jooq.Field;
1714
import org.jooq.SortOrder;
15+
import org.jspecify.annotations.NullMarked;
1816

1917
@Named
18+
@NullMarked
2019
@RequiredArgsConstructor
21-
public class HookRepositoryCustomImpl implements HookRepositoryCustom {
20+
final class HookRepositoryCustomImpl implements HookRepositoryCustom {
2221

2322
private final DSLContext dsl;
2423

@@ -27,7 +26,7 @@ public Collection<Hook> findAll(HooksRequest request, EntityId accountId) {
2726

2827
final var hookTable = HOOK;
2928

30-
final var ownerIdCondition = hookTable.OWNER_ID.eq(accountId.getNum());
29+
final var ownerIdCondition = hookTable.OWNER_ID.eq(accountId.getId());
3130
final var hookIdCondition = getBoundConditions(request.getBounds());
3231
final var orderBy = hookTable.HOOK_ID.sort(request.getOrder().isAscending() ? SortOrder.ASC : SortOrder.DESC);
3332

@@ -37,8 +36,4 @@ public Collection<Hook> findAll(HooksRequest request, EntityId accountId) {
3736
.limit(request.getLimit())
3837
.fetchInto(Hook.class);
3938
}
40-
41-
private Condition getBaseCondition(EntityId accountId, Field<Long> baseField) {
42-
return getCondition(baseField, EQ, accountId.getId());
43-
}
4439
}

rest-java/src/main/java/org/hiero/mirror/restjava/service/HookServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ final class HookServiceImpl implements HookService {
2020

2121
@Override
2222
public Collection<Hook> getHooks(HooksRequest request) {
23-
final var id = entityService.lookup(request.getAccountId());
23+
final var id = entityService.lookup(request.getOwnerId());
2424
return hookRepository.findAll(request, id);
2525
}
2626
}

rest-java/src/test/java/org/hiero/mirror/restjava/mapper/CommonMapperTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.hiero.mirror.common.util.DomainUtils;
2121
import org.hiero.mirror.rest.model.Key.TypeEnum;
2222
import org.hiero.mirror.rest.model.TimestampRange;
23+
import org.hiero.mirror.rest.model.TimestampRangeNullable;
2324
import org.hiero.mirror.restjava.exception.InvalidMappingException;
2425
import org.junit.jupiter.api.Test;
2526
import org.mapstruct.factory.Mappers;
@@ -180,6 +181,52 @@ void mapRange() {
180181
.isEqualTo(range);
181182
}
182183

184+
@Test
185+
void mapTimestampRangeNullable() {
186+
var range = new TimestampRangeNullable();
187+
var now = System.nanoTime();
188+
var timestampString = StringUtils.leftPad(String.valueOf(now), 10, '0');
189+
190+
// test1
191+
assertThat(commonMapper.mapTimestampRangeNullable(null)).isNull();
192+
193+
// test2
194+
range.setFrom("0.0");
195+
range.setTo(null);
196+
assertThat(commonMapper.mapTimestampRangeNullable(Range.atLeast(0L)))
197+
.usingRecursiveComparison()
198+
.isEqualTo(range);
199+
200+
// test3
201+
range.setFrom("0.0");
202+
range.setTo(timestampString.substring(0, timestampString.length() - NANO_DIGITS) + "."
203+
+ timestampString.substring(timestampString.length() - NANO_DIGITS));
204+
assertThat(commonMapper.mapTimestampRangeNullable(Range.openClosed(0L, now)))
205+
.usingRecursiveComparison()
206+
.isEqualTo(range);
207+
208+
// test4
209+
range.setFrom("1586567700.453054000");
210+
range.setTo("1586567700.453054000");
211+
assertThat(commonMapper.mapTimestampRangeNullable(Range.openClosed(1586567700453054000L, 1586567700453054000L)))
212+
.usingRecursiveComparison()
213+
.isEqualTo(range);
214+
215+
// test5
216+
range.setFrom("0.000000001");
217+
range.setTo("0.000000100");
218+
assertThat(commonMapper.mapTimestampRangeNullable(Range.openClosed(1L, 100L)))
219+
.usingRecursiveComparison()
220+
.isEqualTo(range);
221+
222+
// test6
223+
range.setFrom("0.110000000");
224+
range.setTo("1.100000000");
225+
assertThat(commonMapper.mapTimestampRangeNullable(Range.openClosed(110000000L, 1100000000L)))
226+
.usingRecursiveComparison()
227+
.isEqualTo(range);
228+
}
229+
183230
@Test
184231
void mapTimestamp() {
185232
assertThat(commonMapper.mapTimestamp(null)).isNull();

rest-java/src/test/java/org/hiero/mirror/restjava/repository/HookRepositoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void setup() {
3636
void findAllSorted(Direction direction) {
3737
// given
3838
final var request = HooksRequest.builder()
39-
.accountId(EntityIdParameter.valueOf("0.0" + ownerId))
39+
.ownerId(EntityIdParameter.valueOf("0.0" + ownerId))
4040
.limit(5)
4141
.order(direction)
4242
.build();
@@ -65,7 +65,7 @@ void findAllSorted(Direction direction) {
6565
void findAllNoMatch() {
6666
// Request with a non-existent account
6767
final var request = HooksRequest.builder()
68-
.accountId(EntityIdParameter.valueOf("999999"))
68+
.ownerId(EntityIdParameter.valueOf("999999"))
6969
.limit(5)
7070
.order(Direction.ASC)
7171
.build();

rest-java/src/test/java/org/hiero/mirror/restjava/service/HookServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void setup() {
3939
void getHooks() {
4040
// given
4141
final var request = HooksRequest.builder()
42-
.accountId(new EntityIdNumParameter(ownerId))
42+
.ownerId(new EntityIdNumParameter(ownerId))
4343
.limit(5)
4444
.order(Direction.ASC)
4545
.build();
@@ -56,7 +56,7 @@ void getHooksEmptyResult() {
5656
// given – no hooks for this account
5757
final var nonexistent = EntityId.of(domainBuilder.id());
5858
final var request = HooksRequest.builder()
59-
.accountId(new EntityIdNumParameter(nonexistent))
59+
.ownerId(new EntityIdNumParameter(nonexistent))
6060
.limit(5)
6161
.order(Direction.ASC)
6262
.build();

0 commit comments

Comments
 (0)