forked from Qortal/qortal
Added GET /names/search
endpoint, to search names via case insensitive, partial name matching.
This commit is contained in:
parent
f39b6a15da
commit
1a5e3b4fb1
@ -155,6 +155,38 @@ public class NamesResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/search")
|
||||||
|
@Operation(
|
||||||
|
summary = "Search registered names",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
description = "registered name info",
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.APPLICATION_JSON,
|
||||||
|
array = @ArraySchema(schema = @Schema(implementation = NameData.class))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.NAME_UNKNOWN, ApiError.REPOSITORY_ISSUE})
|
||||||
|
public List<NameData> searchNames(@QueryParam("query") String query,
|
||||||
|
@Parameter(ref = "limit") @QueryParam("limit") Integer limit,
|
||||||
|
@Parameter(ref = "offset") @QueryParam("offset") Integer offset,
|
||||||
|
@Parameter(ref="reverse") @QueryParam("reverse") Boolean reverse) {
|
||||||
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
|
if (query == null) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Missing query");
|
||||||
|
}
|
||||||
|
|
||||||
|
return repository.getNameRepository().searchNames(query, limit, offset, reverse);
|
||||||
|
} catch (ApiException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (DataException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Path("/register")
|
@Path("/register")
|
||||||
|
@ -14,6 +14,8 @@ public interface NameRepository {
|
|||||||
|
|
||||||
public boolean reducedNameExists(String reducedName) throws DataException;
|
public boolean reducedNameExists(String reducedName) throws DataException;
|
||||||
|
|
||||||
|
public List<NameData> searchNames(String query, Integer limit, Integer offset, Boolean reverse) throws DataException;
|
||||||
|
|
||||||
public List<NameData> getAllNames(Integer limit, Integer offset, Boolean reverse) throws DataException;
|
public List<NameData> getAllNames(Integer limit, Integer offset, Boolean reverse) throws DataException;
|
||||||
|
|
||||||
public default List<NameData> getAllNames() throws DataException {
|
public default List<NameData> getAllNames() throws DataException {
|
||||||
|
@ -103,6 +103,57 @@ public class HSQLDBNameRepository implements NameRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<NameData> searchNames(String query, Integer limit, Integer offset, Boolean reverse) throws DataException {
|
||||||
|
StringBuilder sql = new StringBuilder(512);
|
||||||
|
List<Object> bindParams = new ArrayList<>();
|
||||||
|
|
||||||
|
sql.append("SELECT name, reduced_name, owner, data, registered_when, updated_when, "
|
||||||
|
+ "is_for_sale, sale_price, reference, creation_group_id FROM Names "
|
||||||
|
+ "WHERE LCASE(name) LIKE ? ORDER BY name");
|
||||||
|
|
||||||
|
bindParams.add(String.format("%%%s%%", query.toLowerCase()));
|
||||||
|
|
||||||
|
if (reverse != null && reverse)
|
||||||
|
sql.append(" DESC");
|
||||||
|
|
||||||
|
HSQLDBRepository.limitOffsetSql(sql, limit, offset);
|
||||||
|
|
||||||
|
List<NameData> names = new ArrayList<>();
|
||||||
|
|
||||||
|
try (ResultSet resultSet = this.repository.checkedExecute(sql.toString(), bindParams.toArray())) {
|
||||||
|
if (resultSet == null)
|
||||||
|
return names;
|
||||||
|
|
||||||
|
do {
|
||||||
|
String name = resultSet.getString(1);
|
||||||
|
String reducedName = resultSet.getString(2);
|
||||||
|
String owner = resultSet.getString(3);
|
||||||
|
String data = resultSet.getString(4);
|
||||||
|
long registered = resultSet.getLong(5);
|
||||||
|
|
||||||
|
// Special handling for possibly-NULL "updated" column
|
||||||
|
Long updated = resultSet.getLong(6);
|
||||||
|
if (updated == 0 && resultSet.wasNull())
|
||||||
|
updated = null;
|
||||||
|
|
||||||
|
boolean isForSale = resultSet.getBoolean(7);
|
||||||
|
|
||||||
|
Long salePrice = resultSet.getLong(8);
|
||||||
|
if (salePrice == 0 && resultSet.wasNull())
|
||||||
|
salePrice = null;
|
||||||
|
|
||||||
|
byte[] reference = resultSet.getBytes(9);
|
||||||
|
int creationGroupId = resultSet.getInt(10);
|
||||||
|
|
||||||
|
names.add(new NameData(name, reducedName, owner, data, registered, updated, isForSale, salePrice, reference, creationGroupId));
|
||||||
|
} while (resultSet.next());
|
||||||
|
|
||||||
|
return names;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new DataException("Unable to search names in repository", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<NameData> getAllNames(Integer limit, Integer offset, Boolean reverse) throws DataException {
|
public List<NameData> getAllNames(Integer limit, Integer offset, Boolean reverse) throws DataException {
|
||||||
StringBuilder sql = new StringBuilder(256);
|
StringBuilder sql = new StringBuilder(256);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user