diff --git a/src/main/java/org/qora/api/resource/NamesResource.java b/src/main/java/org/qora/api/resource/NamesResource.java index 2df4a501..0ecac9ae 100644 --- a/src/main/java/org/qora/api/resource/NamesResource.java +++ b/src/main/java/org/qora/api/resource/NamesResource.java @@ -350,4 +350,34 @@ public class NamesResource { } } + @GET + @Path("/forsale") + @Operation( + summary = "List all registered names up for sale", + responses = { + @ApiResponse( + description = "registered name info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + array = @ArraySchema(schema = @Schema(implementation = NameData.class)) + ) + ) + } + ) + @ApiErrors({ApiError.REPOSITORY_ISSUE}) + public List getNamesForSale(@Parameter(ref = "limit") @QueryParam("limit") int limit, @Parameter(ref = "offset") @QueryParam("offset") int offset) { + try (final Repository repository = RepositoryManager.getRepository()) { + List names = repository.getNameRepository().getNamesForSale(); + + // Pagination would take effect here (or as part of the repository access) + int fromIndex = Integer.min(offset, names.size()); + int toIndex = limit == 0 ? names.size() : Integer.min(fromIndex + limit, names.size()); + names = names.subList(fromIndex, toIndex); + + return names; + } catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e); + } + } + } \ No newline at end of file diff --git a/src/main/java/org/qora/data/naming/NameData.java b/src/main/java/org/qora/data/naming/NameData.java index 8bf3b075..babc086a 100644 --- a/src/main/java/org/qora/data/naming/NameData.java +++ b/src/main/java/org/qora/data/naming/NameData.java @@ -4,6 +4,9 @@ import java.math.BigDecimal; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlTransient; + +import io.swagger.v3.oas.annotations.media.Schema; // All properties to be converted to JSON via JAX-RS @XmlAccessorType(XmlAccessType.FIELD) @@ -15,6 +18,9 @@ public class NameData { private String data; private long registered; private Long updated; + // No need to expose this via API + @XmlTransient + @Schema(hidden = true) private byte[] reference; private boolean isForSale; private BigDecimal salePrice; diff --git a/src/main/java/org/qora/repository/NameRepository.java b/src/main/java/org/qora/repository/NameRepository.java index 78494792..563cc3bf 100644 --- a/src/main/java/org/qora/repository/NameRepository.java +++ b/src/main/java/org/qora/repository/NameRepository.java @@ -12,6 +12,8 @@ public interface NameRepository { public List getAllNames() throws DataException; + public List getNamesForSale() throws DataException; + public List getNamesByOwner(String address) throws DataException; public void save(NameData nameData) throws DataException; diff --git a/src/main/java/org/qora/repository/hsqldb/HSQLDBNameRepository.java b/src/main/java/org/qora/repository/hsqldb/HSQLDBNameRepository.java index b5dbb2e5..26a3fed9 100644 --- a/src/main/java/org/qora/repository/hsqldb/HSQLDBNameRepository.java +++ b/src/main/java/org/qora/repository/hsqldb/HSQLDBNameRepository.java @@ -86,6 +86,38 @@ public class HSQLDBNameRepository implements NameRepository { } } + @Override + public List getNamesForSale() throws DataException { + List names = new ArrayList<>(); + + try (ResultSet resultSet = this.repository + .checkedExecute("SELECT name, data, owner, registered, updated, reference, sale_price FROM Names WHERE is_for_sale = TRUE")) { + if (resultSet == null) + return names; + + do { + String name = resultSet.getString(1); + String data = resultSet.getString(2); + String owner = resultSet.getString(3); + long registered = resultSet.getTimestamp(4, Calendar.getInstance(HSQLDBRepository.UTC)).getTime(); + + // Special handling for possibly-NULL "updated" column + Timestamp updatedTimestamp = resultSet.getTimestamp(5, Calendar.getInstance(HSQLDBRepository.UTC)); + Long updated = updatedTimestamp == null ? null : updatedTimestamp.getTime(); + + byte[] reference = resultSet.getBytes(6); + boolean isForSale = true; + BigDecimal salePrice = resultSet.getBigDecimal(7); + + names.add(new NameData(owner, name, data, registered, updated, reference, isForSale, salePrice)); + } while (resultSet.next()); + + return names; + } catch (SQLException e) { + throw new DataException("Unable to fetch names from repository", e); + } + } + @Override public List getNamesByOwner(String owner) throws DataException { List names = new ArrayList<>();