// Copyright 2020-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

package signalservice;

option java_package         = "org.whispersystems.signalservice.internal.storage";
option java_outer_classname = "SignalStorageProtos";

message StorageManifest  {
  optional uint64 version = 1;
  optional bytes  value   = 2;
}

message StorageItem {
  optional bytes key   = 1;
  optional bytes value = 2;
}

message StorageItems {
  repeated StorageItem items = 1;
}

message ReadOperation {
  repeated bytes readKey = 1;
}

message WriteOperation {
  optional StorageManifest manifest   = 1;
  repeated StorageItem     insertItem = 2;
  repeated bytes           deleteKey  = 3;
  optional bool            clearAll   = 4;
}

message ManifestRecord {
  message Identifier {
    enum Type {
      UNKNOWN = 0;
      CONTACT = 1;
      GROUPV1 = 2;
      GROUPV2 = 3;
      ACCOUNT = 4;
    }

    optional bytes raw  = 1;
    optional Type  type = 2;
  }

  optional uint64     version = 1;
  repeated Identifier keys    = 2;
}

message StorageRecord {
  oneof record {
    ContactRecord contact = 1;
    GroupV1Record groupV1 = 2;
    GroupV2Record groupV2 = 3;
    AccountRecord account = 4;
  }
}

message ContactRecord {
  enum IdentityState {
    DEFAULT    = 0;
    VERIFIED   = 1;
    UNVERIFIED = 2;
  }

  optional string        serviceUuid         = 1;
  optional string        serviceE164         = 2;
  optional bytes         profileKey          = 3;
  optional bytes         identityKey         = 4;
  optional IdentityState identityState       = 5;
  optional string        givenName           = 6;
  optional string        familyName          = 7;
  optional string        username            = 8;
  optional bool          blocked             = 9;
  optional bool          whitelisted         = 10;
  optional bool          archived            = 11;
  optional bool          markedUnread        = 12;
  optional uint64        mutedUntilTimestamp = 13;
}

message GroupV1Record {
  optional bytes  id                  = 1;
  optional bool   blocked             = 2;
  optional bool   whitelisted         = 3;
  optional bool   archived            = 4;
  optional bool   markedUnread        = 5;
  optional uint64 mutedUntilTimestamp = 6;
}

message GroupV2Record {
  optional bytes  masterKey                    = 1;
  optional bool   blocked                      = 2;
  optional bool   whitelisted                  = 3;
  optional bool   archived                     = 4;
  optional bool   markedUnread                 = 5;
  optional uint64 mutedUntilTimestamp          = 6;
  optional bool   dontNotifyForMentionsIfMuted = 7;
}

message AccountRecord {
  enum PhoneNumberSharingMode {
    EVERYBODY     = 0;
    CONTACTS_ONLY = 1;
    NOBODY        = 2;
  }

  message PinnedConversation {
    message Contact {
      optional string uuid = 1;
      optional string e164 = 2;
    }

    oneof identifier {
      Contact contact        = 1;
      bytes   legacyGroupId  = 3;
      bytes   groupMasterKey = 4;
    }
  }

  optional bytes                  profileKey                   = 1;
  optional string                 givenName                    = 2;
  optional string                 familyName                   = 3;
  optional string                 avatarUrl                    = 4;
  optional bool                   noteToSelfArchived           = 5;
  optional bool                   readReceipts                 = 6;
  optional bool                   sealedSenderIndicators       = 7;
  optional bool                   typingIndicators             = 8;
  optional bool                   proxiedLinkPreviews          = 9;
  optional bool                   noteToSelfMarkedUnread       = 10;
  optional bool                   linkPreviews                 = 11;
  optional PhoneNumberSharingMode phoneNumberSharingMode       = 12;
  optional bool                   notDiscoverableByPhoneNumber = 13;
  repeated PinnedConversation     pinnedConversations          = 14;
  optional uint32                 universalExpireTimer         = 17;
  optional bool                   primarySendsSms              = 18;
  optional string                 e164                         = 19;
  repeated string                 preferredReactionEmoji       = 20;
}
