// Copyright (C) 2018 The Android Open Source Project
//
// 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 gerrit.cache;

option java_package = "com.google.gerrit.server.cache.proto";

// Serialized form of com.google.gerrit.server.change.CHangeKindCacheImpl.Key.
// Next ID: 4
message ChangeKindKeyProto {
  bytes prior = 1;
  bytes next = 2;
  string strategy_name = 3;
}

// Serialized form of
// com.google.gerrit.server.change.MergeabilityCacheImpl.EntryKey.
// Next ID: 5
message MergeabilityKeyProto {
  bytes commit = 1;
  bytes into = 2;
  string submit_type = 3;
  string merge_strategy = 4;
}

// Serialized form of com.google.gerrit.extensions.auth.oauth.OAuthToken.
// Next ID: 6
message OAuthTokenProto {
  string token = 1;
  string secret = 2;
  string raw = 3;
  // Epoch millis.
  int64 expires_at_millis = 4;
  string provider_id = 5;
}


// Serialized form of com.google.gerrit.server.notedb.ChangeNotesCache.Key.
// Next ID: 4
message ChangeNotesKeyProto {
  string project = 1;
  int32 change_id = 2;
  bytes id = 3;
}

// Serialized from of com.google.gerrit.server.notedb.ChangeNotesState.
//
// Note on embedded protos: this is just for storing in a cache, so some formats
// were chosen ease of coding the initial implementation. In particular, where
// there already exists another serialization mechanism in Gerrit for
// serializing a particular field, we use that rather than defining a new proto
// type. This includes types that can be serialized to proto using
// ProtoConverters as well as NoteDb and indexed types that are serialized using
// JSON. We can always revisit this decision later; it just requires bumping the
// cache version.
//
// Note on nullability: there are a lot of nullable fields in ChangeNotesState
// and its dependencies. It's likely we could make some of them non-nullable,
// but each one of those would be a potentially significant amount of cleanup,
// and there's no guarantee we'd be able to eliminate all of them. (For a less
// complex class, it's likely the cleanup would be more feasible.)
//
// Instead, we just take the tedious yet simple approach of having a "has_foo"
// field for each nullable field "foo", indicating whether or not foo is null.
//
// Next ID: 24
message ChangeNotesStateProto {
  // Effectively required, even though the corresponding ChangeNotesState field
  // is optional, since the field is only absent when NoteDb is disabled, in
  // which case attempting to use the ChangeNotesCache is programmer error.
  bytes meta_id = 1;

  int32 change_id = 2;

  // Next ID: 26
  message ChangeColumnsProto {
    string change_key = 1;

    // Epoch millis.
    int64 created_on_millis = 2;

    // Epoch millis.
    int64 last_updated_on_millis = 3;

    int32 owner = 4;

    string branch = 5;

    int32 current_patch_set_id = 6;
    bool has_current_patch_set_id = 7;

    string subject = 8;

    string topic = 9;
    bool has_topic = 10;

    string original_subject = 11;
    bool has_original_subject = 12;

    string submission_id = 13;
    bool has_submission_id = 14;

    reserved 15;  // assignee
    reserved 16;  // has_assignee

    string status = 17;
    bool has_status = 18;

    bool is_private = 19;

    bool work_in_progress = 20;

    bool review_started = 21;

    int32 revert_of = 22;
    bool has_revert_of = 23;

    string cherry_pick_of = 24;
    bool has_cherry_pick_of = 25;
  }
  // Effectively required, even though the corresponding ChangeNotesState field
  // is optional, since the field is only absent when NoteDb is disabled, in
  // which case attempting to use the ChangeNotesCache is programmer error.
  ChangeColumnsProto columns = 3;

  reserved 4; // past_assignee

  repeated string hashtag = 5;

  // Raw PatchSet proto as produced by PatchSetProtoConverter.
  repeated bytes patch_set = 6;

  // Raw PatchSetApproval proto as produced by PatchSetApprovalProtoConverter.
  repeated bytes approval = 7;

  // Next ID: 4
  message ReviewerSetEntryProto {
    string state = 1;
    int32 account_id = 2;
    // Epoch millis.
    int64 timestamp_millis = 3;
  }
  repeated ReviewerSetEntryProto reviewer = 8;

  // Next ID: 4
  message ReviewerByEmailSetEntryProto {
    string state = 1;
    string address = 2;
    // Epoch millis.
    int64 timestamp_millis = 3;
  }
  repeated ReviewerByEmailSetEntryProto reviewer_by_email = 9;

  repeated ReviewerSetEntryProto pending_reviewer = 10;

  repeated ReviewerByEmailSetEntryProto pending_reviewer_by_email = 11;

  repeated int32 past_reviewer = 12;

  // Next ID: 5
  message ReviewerStatusUpdateProto {
    // Epoch millis.
    int64 timestamp_millis = 1;
    int32 updated_by = 2;
    int32 reviewer = 3;
    string state = 4;
  }
  repeated ReviewerStatusUpdateProto reviewer_update = 13;

  // JSON produced from
  // com.google.gerrit.server.index.change.ChangeField.StoredSubmitRecord.
  repeated string submit_record = 14;

  // Raw ChangeMessage proto as produced by ChangeMessageProtoConverter.
  repeated bytes change_message = 15;

  // JSON produced from com.google.gerrit.entities.Comment.
  repeated string published_comment = 16;

  reserved 17;  // read_only_until
  reserved 18;  // has_read_only_until

  // Number of updates to the change's meta ref.
  int32 update_count = 19;

  string server_id = 20;
  bool has_server_id = 21;

  message AssigneeStatusUpdateProto {
    // Epoch millis.
    int64 timestamp_millis = 1;
    int32 updated_by = 2;
    int32 current_assignee = 3;
    bool has_current_assignee = 4;
  }
  repeated AssigneeStatusUpdateProto assignee_update = 22;

  // An update to the attention set of the change. See class AttentionSetUpdate
  // for context.
  message AttentionSetUpdateProto {
    // Epoch millis.
    int64 timestamp_millis = 1;
    int32 account = 2;
    // Maps to enum AttentionSetUpdate.Operation
    string operation = 3;
    string reason = 4;
  }
  repeated AttentionSetUpdateProto attention_set_update = 23;
}

// Serialized form of com.google.gerrit.server.query.change.ConflictKey
message ConflictKeyProto {
  bytes commit = 1;
  bytes other_commit = 2;
  string submit_type = 3;
  bool content_merge = 4;
}

// Serialized form of com.google.gerrit.server.query.git.TagSetHolder.
// Next ID: 3
message TagSetHolderProto {
  string project_name = 1;

  // Next ID: 4
  message TagSetProto {
    string project_name = 1;

    // Next ID: 3
    message CachedRefProto {
      bytes id = 1;
      int32 flag = 2;
    }
    map<string, CachedRefProto> ref = 2;

    // Next ID: 3
    message TagProto {
      bytes id = 1;
      bytes flags = 2;
    }
    repeated TagProto tag = 3;
  }
  TagSetProto tags = 2;
}

// Serialized form of
// com.google.gerrit.server.account.externalids.AllExternalIds.
// Next ID: 2
message AllExternalIdsProto {
  // Next ID: 6
  message ExternalIdProto {
    string key = 1;
    int32 accountId = 2;
    string email = 3;
    string password = 4;
    bytes blobId = 5;
  }
  repeated ExternalIdProto external_id = 1;
}

// Key for com.google.gerrit.server.git.PureRevertCache.
// Next ID: 4
message PureRevertKeyProto {
  string project = 1;
  bytes claimed_original = 2;
  bytes claimed_revert = 3;
}

// Key for com.google.gerrit.server.account.ProjectWatches.ProjectWatcheKey.
// Next ID: 3
message ProjectWatchKeyProto {
  string project = 1;
  string filter = 2;
}

// Serialized form of
// com.google.gerrit.entities.Account.
// Next ID: 9
message AccountProto {
  int32 id = 1;
  int64 registered_on = 2;
  string full_name = 3;
  string display_name = 4;
  string preferred_email = 5;
  bool inactive = 6;
  string status = 7;
  string meta_id = 8;
}