下面列出了io.grpc.stub.StreamObserver#onValue ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public final void signIn(final SignInRequest request,
final StreamObserver<SignInResponse> responseObserver) {
SignInResponse reply;
try {
GitkitUser gitkitUser = AuthUtils.verifyGitkitToken(request.getGitkitToken());
reply = SignInResponse.newBuilder().setUserToken(AuthUtils.getJwt(gitkitUser.getLocalId()))
.build();
} catch (GitkitClientException | IOException | SignatureException | InvalidKeyException e) {
LOGGER.warning("Authentication error with Gitkit Client " + e.getMessage());
reply = SignInResponse.newBuilder().setError(getErrorMessage("500", e.getMessage())).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}
@Override
public final void ratePhoto(final VoteRequest request,
final StreamObserver<StatusResponse> responseObserver) {
StatusResponse reply;
if (AuthUtils.isSignedIn()) {
long photoId = request.getPhotoId();
try {
Entity photo = dbClient.getPhoto(photoId);
// Let's rate the photo
int vote = 0;
if (request.getVote() == VoteRequest.VoteType.THUMBS_DOWN) {
vote = -1;
} else if (request.getVote() == VoteRequest.VoteType.THUMBS_UP) {
vote = 1;
}
if (photo != null && dbClient.voteForPhoto(photoId, vote, AuthUtils.getUserId())) {
// Everything went well
reply = StatusResponse.newBuilder().build();
} else if (photo == null) {
// Photo does not exist
reply = StatusResponse.newBuilder().setError(getErrorMessage("404", "Photo not found"))
.build();
} else {
// Internal error, impossible to rate
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} catch (DatastoreException e) {
// Internal error
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
reply = StatusResponse.newBuilder().setError(getAuthErrorMessage()).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}
/**
* Lists photos for listMyPhotos, listMyLikes.
* @param request the gRPC request
* @param responseObserver the gRPC response observer that will send the response to the client
* @param listKind the kind of list we want to return from dbClient.PhotoListType
*/
public final void listPhotos(final PhotoListRequest request,
final StreamObserver<PhotoListResponse> responseObserver,
final DbClient.PhotoListType listKind) {
PhotoListResponse reply;
if (AuthUtils.isSignedIn()) {
long page = request.getPageNumber();
DbClient.EntityListAndCursorResult photoListAndCursor;
try {
ByteString cursor = null;
boolean pageError = false;
if (page != 0) {
Entity cursorEntity = dbClient.getAndDeleteCursor(page);
if (cursorEntity != null) {
cursor = getByteString(getPropertyMap(cursorEntity).get("cursor"));
} else {
pageError = true;
}
}
photoListAndCursor = dbClient.getPhotoList(AuthUtils.getUserId(), listKind, cursor);
PhotoListResponse.Builder builder = PhotoListResponse.newBuilder();
if (pageError) {
// Invalid cursor, send an error but also return results
builder.setError(getErrorMessage("400-200",
"Invalid page, returning results from scratch"));
}
for (Entity result : photoListAndCursor.getEntityList()) {
Map<String, Value> props = getPropertyMap(result);
long rating = 1;
if (listKind == DbClient.PhotoListType.PHOTO_LIST_STREAM) {
rating = dbClient.getVoteValueForPhoto(DbUtils.getEntityId(result),
getString(props.get("userId")));
}
Photo photo = Photo.newBuilder()
.setPhotoId(DbUtils.getEntityId(result))
.setUserId(getString(props.get("userId")))
.setDate(getTimestamp(props.get("date")))
.setDescription(getString(props.get("description")))
.setRating(rating)
.setUrl(BackendConstants.IMAGES_BASE_URL + DbUtils.getEntityId(result) + "_"
+ getString(props.get("userId")) + ".webp")
.build();
builder.addPhoto(photo);
}
if (photoListAndCursor.getCursor() != null
&& photoListAndCursor.getEntityList().size() > 0) {
long cursorId = dbClient.insertCursor(photoListAndCursor.getCursor(),
AuthUtils.getUserId());
builder.setNextPage(cursorId);
}
// Everything went well
reply = builder.build();
} catch (DatastoreException e) {
// Internal error, impossible to list the photos
reply = PhotoListResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
reply = PhotoListResponse.newBuilder().setError(getAuthErrorMessage()).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}
@Override
public final void flagPhoto(final FlagRequest request,
final StreamObserver<StatusResponse> responseObserver) {
StatusResponse reply;
if (AuthUtils.isSignedIn()) {
long photoId = request.getPhotoId();
try {
Entity photo = dbClient.getPhoto(photoId);
if (photo == null) {
throw new DatastoreException("flagPhoto", 404, "Photo not found in Database", null);
}
List<Entity> photoFlags = dbClient.getPhotoFlags(photo.getKey());
boolean hasAlreadyFlagged = false;
for (Entity flag : photoFlags) {
Map<String, Value> propsFlag = getPropertyMap(flag);
String userIdFlag = propsFlag.get("userId").getStringValue();
if (userIdFlag != null && userIdFlag.equals(AuthUtils.getUserId())) {
hasAlreadyFlagged = true;
}
}
if (!hasAlreadyFlagged) {
if (dbClient.insertFlag(photo.getKey(), AuthUtils.getUserId())) {
if (photoFlags.size() + 1 >= 2 && !dbClient.setPhotoFlagged(photo.getKey())) {
// Internal error, impossible to flag the photo
// Let's not say anything to the user as he did
// his job.
LOGGER.warning("Impossible to flag photo=" + photoId + " with count_flags="
+ photoFlags.size());
}
// Everything went well
reply = StatusResponse.newBuilder().build();
} else {
// Internal error, impossible to store the flag
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
// User has already flagged the picture, do nothing
reply = StatusResponse.newBuilder().build();
}
} catch (DatastoreException e) {
// Internal error, impossible to store the flag
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
reply = StatusResponse.newBuilder().setError(getAuthErrorMessage()).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}
@Override
public final void editPhoto(final EditPhotoRequest request,
final StreamObserver<StatusResponse> responseObserver) {
StatusResponse reply;
if (AuthUtils.isSignedIn()) {
long photoId = request.getPhotoId();
Entity photo;
try {
photo = dbClient.getPhoto(photoId);
if (photo == null) {
throw new DatastoreException("editPhoto", 404, "Photo not found in Database", null);
}
Map<String, Value> propsPhoto = getPropertyMap(photo);
String userIdPhoto = propsPhoto.get("userId").getStringValue();
if (userIdPhoto != null) {
if (userIdPhoto.equals(AuthUtils.getUserId())) {
// Let's update the photo
if (dbClient.updatePhotoDescription(photo.getKey(), request.getDescription())) {
// Everything went well
reply = StatusResponse.newBuilder().build();
} else {
// Internal error, impossible to delete
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
// The user is trying to edit a photo that he does not
// own
reply = StatusResponse.newBuilder().setError(getErrorMessage("403",
"Not the owner of the photo")).build();
}
} else {
// Internal error - no property userId on the photo
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} catch (DatastoreException e) {
// Internal error
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
reply = StatusResponse.newBuilder().setError(getAuthErrorMessage()).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}
@Override
public final void deletePhoto(final DeletePhotoRequest request,
final StreamObserver<StatusResponse> responseObserver) {
StatusResponse reply;
if (AuthUtils.isSignedIn()) {
long photoId = request.getPhotoId();
try {
Entity photo = dbClient.getPhoto(photoId);
if (photo == null) {
throw new DatastoreException("deletePhoto", 404, "Photo not found in Database", null);
}
Map<String, Value> propsPhoto = getPropertyMap(photo);
String userIdPhoto = propsPhoto.get("userId").getStringValue();
if (userIdPhoto != null) {
if (userIdPhoto.equals(AuthUtils.getUserId())) {
// Let's delete all the data associated to this photo
if (dbClient.deletePhotoAndChildren(photo.getKey())) {
// Everything went well
reply = StatusResponse.newBuilder().build();
} else {
// Internal error, impossible to delete
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
// The user is trying to suppress a photo that he
// does not own
reply = StatusResponse.newBuilder().setError(getErrorMessage("403",
"Not the owner of the photo")).build();
}
} else {
// Internal error - no property userId on the photo
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} catch (DatastoreException e) {
// Internal error
reply = StatusResponse.newBuilder().setError(getDbErrorMessage()).build();
}
} else {
reply = StatusResponse.newBuilder().setError(getAuthErrorMessage()).build();
}
responseObserver.onValue(reply);
responseObserver.onCompleted();
}