// Copyright (c) 2015, 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.

syntax = "proto3";

package google.example.library.v1;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";

option go_package = "google.golang.org/genproto/googleapis/example/library/v1;library";
option java_multiple_files = true;
option java_outer_classname = "LibraryProto";
option java_package = "com.google.example.library.v1";


// This API represents a simple digital library.  It lets you manage Shelf
// resources and Book resources in the library. It defines the following
// resource model:
//
// - The API has a collection of [Shelf][google.example.library.v1.Shelf]
//   resources, named `shelves/*`
//
// - Each Shelf has a collection of [Book][google.example.library.v1.Book]
//   resources, named `shelves/*/books/*`
service LibraryService {
  // Creates a shelf, and returns the new Shelf.
  rpc CreateShelf(CreateShelfRequest) returns (Shelf) {
    option (google.api.http) = { post: "/v1/shelves" body: "shelf" };
  }

  // Gets a shelf. Returns NOT_FOUND if the shelf does not exist.
  rpc GetShelf(GetShelfRequest) returns (Shelf) {
    option (google.api.http) = { get: "/v1/{name=shelves/*}" };
  }

  // Lists shelves. The order is unspecified but deterministic. Newly created
  // shelves will not necessarily be added to the end of this list.
  rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {
    option (google.api.http) = { get: "/v1/shelves" };
  }

  // Deletes a shelf. Returns NOT_FOUND if the shelf does not exist.
  rpc DeleteShelf(DeleteShelfRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/{name=shelves/*}" };
  }

  // Merges two shelves by adding all books from the shelf named
  // `other_shelf_name` to shelf `name`, and deletes
  // `other_shelf_name`. Returns the updated shelf.
  // The book ids of the moved books may not be the same as the original books.
  //
  // Returns NOT_FOUND if either shelf does not exist.
  // This call is a no-op if the specified shelves are the same.
  rpc MergeShelves(MergeShelvesRequest) returns (Shelf) {
    option (google.api.http) = { post: "/v1/{name=shelves/*}:merge" body: "*" };
  }

  // Creates a book, and returns the new Book.
  rpc CreateBook(CreateBookRequest) returns (Book) {
    option (google.api.http) = { post: "/v1/{name=shelves/*}/books" body: "book" };
  }

  // Gets a book. Returns NOT_FOUND if the book does not exist.
  rpc GetBook(GetBookRequest) returns (Book) {
    option (google.api.http) = { get: "/v1/{name=shelves/*/books/*}" };
  }

  // Lists books in a shelf. The order is unspecified but deterministic. Newly
  // created books will not necessarily be added to the end of this list.
  // Returns NOT_FOUND if the shelf does not exist.
  rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) {
    option (google.api.http) = { get: "/v1/{name=shelves/*}/books" };
  }

  // Deletes a book. Returns NOT_FOUND if the book does not exist.
  rpc DeleteBook(DeleteBookRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/{name=shelves/*/books/*}" };
  }

  // Updates a book. Returns INVALID_ARGUMENT if the name of the book
  // is non-empty and does equal the previous name.
  rpc UpdateBook(UpdateBookRequest) returns (Book) {
    option (google.api.http) = { put: "/v1/{name=shelves/*/books/*}" body: "book" };
  }

  // Moves a book to another shelf, and returns the new book. The book
  // id of the new book may not be the same as the original book.
  rpc MoveBook(MoveBookRequest) returns (Book) {
    option (google.api.http) = { post: "/v1/{name=shelves/*/books/*}:move" body: "*" };
  }
}

// A single book in the library.
message Book {
  // The resource name of the book.
  // Book names have the form `shelves/{shelf_id}/books/{book_id}`.
  // The name is ignored when creating a book.
  string name = 1;

  // The name of the book author.
  string author = 2;

  // The title of the book.
  string title = 3;

  // Value indicating whether the book has been read.
  bool read = 4;
}

// A Shelf contains a collection of books with a theme.
message Shelf {
  // The resource name of the shelf.
  // Shelf names have the form `shelves/{shelf_id}`.
  // The name is ignored when creating a shelf.
  string name = 1;

  // The theme of the shelf
  string theme = 2;
}

// Request message for LibraryService.CreateShelf.
message CreateShelfRequest {
  // The shelf to create.
  Shelf shelf = 1;
}

// Request message for LibraryService.GetShelf.
message GetShelfRequest {
  // The name of the shelf to retrieve.
  string name = 1;
}

// Request message for LibraryService.ListShelves.
message ListShelvesRequest {
  // Requested page size. Server may return fewer shelves than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 1;

  // A token identifying a page of results the server should return.
  // Typically, this is the value of
  // [ListShelvesResponse.next_page_token][google.example.library.v1.ListShelvesResponse.next_page_token]
  // returned from the previous call to `ListShelves` method.
  string page_token = 2;
}

// Response message for LibraryService.ListShelves.
message ListShelvesResponse {
  // The list of shelves.
  repeated Shelf shelves = 1;

  // A token to retrieve next page of results.
  // Pass this value in the
  // [ListShelvesRequest.page_token][google.example.library.v1.ListShelvesRequest.page_token]
  // field in the subsequent call to `ListShelves` method to retrieve the next
  // page of results.
  string next_page_token = 2;
}

// Request message for LibraryService.DeleteShelf.
message DeleteShelfRequest {
  // The name of the shelf to delete.
  string name = 1;
}

// Describes the shelf being removed (other_shelf_name) and updated
// (name) in this merge.
message MergeShelvesRequest {
  // The name of the shelf we're adding books to.
  string name = 1;

  // The name of the shelf we're removing books from and deleting.
  string other_shelf_name = 2;
}

// Request message for LibraryService.CreateBook.
message CreateBookRequest {
  // The name of the shelf in which the book is created.
  string name = 1;

  // The book to create.
  Book book = 2;
}

// Request message for LibraryService.GetBook.
message GetBookRequest {
  // The name of the book to retrieve.
  string name = 1;
}

// Request message for LibraryService.ListBooks.
message ListBooksRequest {
  // The name of the shelf whose books we'd like to list.
  string name = 1;

  // Requested page size. Server may return fewer books than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  // Typically, this is the value of
  // [ListBooksResponse.next_page_token][google.example.library.v1.ListBooksResponse.next_page_token].
  // returned from the previous call to `ListBooks` method.
  string page_token = 3;
}

// Response message for LibraryService.ListBooks.
message ListBooksResponse {
  // The list of books.
  repeated Book books = 1;

  // A token to retrieve next page of results.
  // Pass this value in the
  // [ListBooksRequest.page_token][google.example.library.v1.ListBooksRequest.page_token]
  // field in the subsequent call to `ListBooks` method to retrieve the next
  // page of results.
  string next_page_token = 2;
}

// Request message for LibraryService.UpdateBook.
message UpdateBookRequest {
  // The name of the book to update.
  string name = 1;

  // The book to update with. The name must match or be empty.
  Book book = 2;
}

// Request message for LibraryService.DeleteBook.
message DeleteBookRequest {
  // The name of the book to delete.
  string name = 1;
}

// Describes what book to move (name) and what shelf we're moving it
// to (other_shelf_name).
message MoveBookRequest {
  // The name of the book to move.
  string name = 1;

  // The name of the destination shelf.
  string other_shelf_name = 2;
}
