// Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
//
// 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";

option go_package = "github.com/opencord/voltha-protos/v5/go/voip_user_profile";
option java_package = "org.opencord.voltha.voip_user_profile";

package voip_user_profile;
import "google/api/annotations.proto";

// A user specific profile for voip service
message VoipUserProfileRequest {
  // for the path in KV store
  string key = 1;
  VoipUserProfile voipUserProfile = 2;
}

message VoipUserProfile {
  string voipSystemProfileKey = 1;
  string username = 2;
  string password = 3;
  string domain = 4;
  string proxy = 5;
  uint32 port = 6;
  string sipDisplayName = 7;
  string realm = 8;
}