Parece que é melhor escrever um controlador personalizado em vez de usar Spring Data REST aqui, pois basicamente você precisa de dois recursos:um para adicionar um link ou retornar um existente e um segundo para recuperar um URI original por meio de seu hash.
No primeiro método, você simplesmente chamaria um método de repositório
findByLongURL(…)
e use o URL
obtido instância se você tiver um resultado ou der um segundo passo para realmente criar o hash e salvar o URL
repositório de pensamento de instância. O segundo recurso basicamente chamaria seu método já existente. Isso é direto e fácil de digerir.
Se você precisar que a implementação do método anterior seja uma operação atômica, o método de consulta do repositório precisa ser implementado manualmente (para obter instruções gerais sobre isso, leia a seção relevante no documentação de referência ):
class UrlRepositoryImpl implements UrlRepositoryCustom {
private final MongoOperations operations;
public UrlRepositoryImpl(MongoOperations operations) {
this.operations = operations;
}
@Override
public URL findOrInsert(String source) {
// What to find?
Query query = Query.query(Criteria.where("longURL").is(source);
// What to write if nothing can be found
Update update = new Update()
.setOnInsert("longURL", source)
.setOnInsert("hash", calculatedHash);
FindAndModifyOptions options = new FindAndModifyOptions.options()
.returnNew(true) // returns the document insert (if so)
.upsert(true); // insert document if it doesn't exist
return operations.findAndModify(query, update, options, URL.class);
}
}
Como você pode ver, isso envolve lidar com alguns detalhes de nível inferior (embora a verbosidade possa ser reduzida usando importações estáticas), mas basicamente fornece uma operação atômica.