// Copyright 2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package codereview.internal;
option java_package = "com.google.codereview.internal";

import "next_received_bundle.proto";
import "prune_bundles.proto";
import "update_received_bundle.proto";

service BundleStoreService {
  // Grab the next available bundle.  The bundle is deferred from
  // processing for a short period of time to avoid duplicate work.
  //
  rpc NextReceivedBundle(NextReceivedBundleRequest)
  returns (NextReceivedBundleResponse);

  // Get a single, specific segment of a bundle.
  //
  rpc BundleSegment(BundleSegmentRequest)
  returns (BundleSegmentResponse);

  // Acknowledge a bundle as received into Git.
  //
  rpc UpdateReceivedBundle(UpdateReceivedBundleRequest)
  returns (UpdateReceivedBundleResponse);

  // Clear out any bundles we don't need any longer.
  //
  rpc PruneBundles(PruneBundlesRequest)
  returns (PruneBundlesResponse);
}
