syntax = "proto3";
    option go_package = "./artifacts/academy-server/release-tsjs/modules/passports";

import "artifacts/academy-server/release-tsjs/core/common.proto";
import "artifacts/academy-server/release-tsjs/modules/workspaces/index.proto";








;



service Passports {
    rpc PassportActionEmailSignup (EmailAccountSignupDto) returns (CreateByMailResponse) {}
}

message CreateByMailResponse {
    IError error = 1;
    UserSessionDto data = 2;
}

message EmailAccountSignupDto {
    string email = 1; // @tag(validate:"required") 
    string password = 2; // @tag(validate:"required")
    string firstName = 3; // @tag(validate:"required")
    string lastName = 4; // @tag(validate:"required")
    string inviteId = 5;
    string publicJoinKeyId = 6;
    string workspaceTypeId = 7;
}

message EmailAccountSigninDto {
    string email = 1; // @tag(validate:"required") 
    string password = 2; // @tag(validate:"required")
}

message PhoneNumberAccountCreationDto {
    string phoneNumber = 1; // @tag(validate:"required") 
}

message PhoneNumberUniversalAuthenticateDto {
    string phoneNumber = 1; // @tag(validate:"required") 
}

message ForgetPasswordEntity {
	UserEntity user = 1; // @tag(gorm:"foreignKey:UserId;references:UniqueId" json:"-")
	optional string userId = 2; // @tag(json:"-")

	PassportEntity passport = 3; // @tag(gorm:"foreignKey:PassportId;references:UniqueId" json:"-")
	optional string passportId = 4; // @tag(json:"passportId" json:"-")

	string status = 5; // @tag(json:"-")

    string uniqueId           = 6; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;" json:"-")
	
	Timestamp validUntil = 8;
	Timestamp blockedUntil = 9;
    int64 secondsToUnblock = 10;
    string otp = 11; // @tag(json:"-")
    string recoveryAbsoluteUrl = 12; // @tag(json:"-" gorm:"-" sql:"-")

    int64 updated = 16; // @tag(gorm:"autoUpdateTime:nano")
    int64 created = 17; // @tag(gorm:"autoUpdateTime:nano")
}
 
message EmailConfirmationEntity {
    string uniqueId           = 1; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;")
	UserEntity user = 2; // @tag(gorm:"foreignKey:UserId;references:UniqueId" json:"-")
	optional string userId = 3;
	string status = 4;

	string expiresAt = 5;

    int64 updated = 16; // @tag(gorm:"autoUpdateTime:nano")
    int64 created = 17; // @tag(gorm:"autoUpdateTime:nano")
}

message PhoneConfirmationEntity {
    string uniqueId           = 1; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;")
	UserEntity user = 2; // @tag(gorm:"foreignKey:UserId;references:UniqueId" json:"-")
	optional string userId = 3;
	string status = 4;
	string phoneNumber = 5;
	string key = 6;

	string expiresAt = 7;

    int64 updated = 16; // @tag(gorm:"autoUpdateTime:nano")
    int64 created = 17; // @tag(gorm:"autoUpdateTime:nano")
}

message PassportEntity {
    string type = 1; // @tag(json:"type" validate:"required")
	string value   = 2; // @tag(json:"value" gorm:"unique" validate:"required")
	string password    = 3; // @tag(json:"-")
	bool   confirmed   = 4; // @tag(json:"confirmed")
	string accessToken = 5; // @tag(json:"accessToken")
	string userId      = 6; // @tag(json:"userId" validate:"required")
	string uniqueId    = 7; // @tag(json:"uniqueId" gorm:"primarykey;uniqueId;unique;not null;size:100;")

    int64 updated = 16; // @tag(gorm:"autoUpdateTime:nano")
    int64 created = 17; // @tag(gorm:"autoUpdateTime:nano")
}

message UserSessionDto {
    PassportEntity passport = 1;
    string token = 2;
    string exchangeKey = 3;
    repeated UserRoleWorkspace userRoleWorkspaces = 4;// @tag(json:"userRoleWorkspaces")
    UserEntity user   = 5;
}

message PublicJoinKey {
    WorkspaceEntity workspace = 1;  // @tag(gorm:"foreignKey:WorkspaceId;references:UniqueId" json:"-")
	optional string workspaceId = 2;  // @tag(json:"workspaceId" gorm:"size:100;")
	
    RoleEntity role = 3; // @tag(gorm:"foreignKey:RoleId;references:UniqueId")
	optional string roleId = 4; // @tag(gorm:"size:100;")

    string uniqueId = 5; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;" yaml:"uniqueId")
    optional string visibility = 6; // @tag(yaml:"visibility")

    int64 updated = 16; // @tag(gorm:"autoUpdateTime:nano")
    int64 created = 17; // @tag(gorm:"autoUpdateTime:nano")
}

// message PublicJoinKeyConfig {
//     WorkspaceEntity workspace = 1;  // @tag(gorm:"foreignKey:WorkspaceId;references:UniqueId" json:"-")
// 	optional string workspaceId = 2;  // @tag(json:"workspaceId" gorm:"size:100;")
	
//     RoleEntity role = 3; // @tag(gorm:"foreignKey:RoleId;references:UniqueId")
// 	optional string roleId = 4; // @tag(gorm:"size:100;")

//     string uniqueId = 5; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;" yaml:"uniqueId")
// }

message OtpAuthenticateDto {
    string value = 1; // @tag(validate:"required")
	string otp = 2;
    string type = 3; // @tag(validate:"required")
    string password = 4;
}

message EmailOtpResponse {
    ForgetPasswordEntity request = 1;
	UserSessionDto userSession = 2;
}

message ResetEmailDto {
    string password = 1;
}





  

  

  
      
service PassportMethods {
  rpc PassportMethodActionCreate (PassportMethodEntity) returns (PassportMethodCreateReply) {}
  rpc PassportMethodActionUpdate (PassportMethodEntity) returns (PassportMethodCreateReply) {}

  rpc PassportMethodActionQuery (QueryFilterRequest) returns (PassportMethodQueryReply) {}
  rpc PassportMethodActionGetOne (QueryFilterRequest) returns (PassportMethodReply) {}
  rpc PassportMethodActionRemove (QueryFilterRequest) returns (RemoveReply) {}
}

message PassportMethodCreateReply {
	PassportMethodEntity data  = 1;
	IError error = 2;
}

message PassportMethodReply {
	PassportMethodEntity data = 1;
	IError error = 2;
}

message PassportMethodQueryReply {
	repeated PassportMethodEntity items = 1;
	int64 totalItems = 2;
	int64 itemsPerPage = 3;
	int64 startIndex = 4;
	IError error = 5;
}







 
message PassportMethodEntity {
  optional string visibility = 1; // @tag(yaml:"visibility")
  optional string workspaceId = 2; // @tag(yaml:"workspaceId")
  optional string linkerId = 3; // @tag(yaml:"linkerId")
  optional string parentId = 4; // @tag(yaml:"parentId")
  string uniqueId = 5; // @tag(gorm:"primarykey;uniqueId;unique;not null;size:100;" yaml:"uniqueId")
  optional string userId = 6; // @tag(yaml:"userId")
  repeated PassportMethodEntityPolyglot translations = 7; // @tag(gorm:"foreignKey:LinkerId;references:UniqueId" json:"translations")
  optional string name = 9; // @tag(translate:"true" validate:"required" yaml:"name"  )

  optional string type = 10; // @tag( validate:"required" yaml:"type"  )

  optional string region = 11; // @tag( validate:"required" yaml:"region"  )

  int64 rank = 12; // @tag(gorm:"type:int;name:rank")
  int64 updated = 13; // @tag(gorm:"autoUpdateTime:nano")
  int64 created = 14; // @tag(gorm:"autoUpdateTime:nano")
  string createdFormatted = 15; // @tag(sql:"-")
  string updatedFormatted = 16; // @tag(sql:"-")

}

/* Because it has translation field, we need a translation table for this */
message PassportMethodEntityPolyglot {
  string linkerId = 1; // @tag(gorm:"uniqueId;not null;size:100;" json:"linkerId" yaml:"linkerId")
  string languageId = 2; // @tag(gorm:"uniqueId;not null;size:100;" json:"languageId" yaml:"languageId")

  string name = 3; // @tag(yaml:"name" json:"name");

}









/**
* Add your custom services, and messages here.
* It can be your dto for example. 
* - Use Module.yml for entities, otherwise it won't be managed
* - Don't use this file for entities might be queried by web
**/
      


