syntax = "proto3";
option go_package = "./pb";

package pb;

import "models/rpc_messages.proto";
import "models/model_ip_item.proto";
import "models/model_ip_list.proto";
import "models/model_server.proto";
import "models/model_http_firewall_policy.proto";

// IP条目管理
service IPItemService {
	// 创建IP
	rpc createIPItem (CreateIPItemRequest) returns (CreateIPItemResponse);

	// 创建一组IP
	rpc createIPItems(CreateIPItemsRequest) returns (CreateIPItemsResponse);

	// 修改IP
	rpc updateIPItem (UpdateIPItemRequest) returns (RPCSuccess);

	// 删除IP
	rpc deleteIPItem (DeleteIPItemRequest) returns (RPCSuccess);

	// 批量删除IP
	rpc deleteIPItems(DeleteIPItemsRequest) returns (RPCSuccess);

	// 计算IP数量
	rpc countIPItemsWithListId (CountIPItemsWithListIdRequest) returns (RPCCountResponse);

	// 列出单页的IP
	rpc listIPItemsWithListId (ListIPItemsWithListIdRequest) returns (ListIPItemsWithListIdResponse);

	// 查找单个IP
	rpc findEnabledIPItem (FindEnabledIPItemRequest) returns (FindEnabledIPItemResponse);

	// 根据版本列出一组IP
	rpc listIPItemsAfterVersion (ListIPItemsAfterVersionRequest) returns (ListIPItemsAfterVersionResponse);

	// 检查IP状态
	rpc checkIPItemStatus (CheckIPItemStatusRequest) returns (CheckIPItemStatusResponse);

	// 检查IP是否存在
	rpc existsEnabledIPItem (ExistsEnabledIPItemRequest) returns (ExistsEnabledIPItemResponse);

	// 计算所有IP数量
	rpc countAllEnabledIPItems(CountAllEnabledIPItemsRequest) returns (RPCCountResponse);

	// 列出所有名单中的IP
	rpc listAllEnabledIPItems(ListAllEnabledIPItemsRequest) returns (ListAllEnabledIPItemsResponse);

	// 列出所有名单中的IP ID
	rpc listAllIPItemIds(ListAllIPItemIdsRequest) returns (ListAllIPItemIdsResponse);

	// 设置所有为已读
	rpc updateIPItemsRead(UpdateIPItemsReadRequest) returns (RPCSuccess);

	// 查找IP对应的名单所属网站ID
	rpc findServerIdWithIPItemId(FindServerIdWithIPItemIdRequest) returns (FindServerIdWithIPItemIdResponse);
}

// 创建IP
message CreateIPItemRequest {
	int64 ipListId = 1; // 所属IP列表ID
	string ipFrom = 2; // 开始IP
	string ipTo = 3; // 结束IP（可选）
	int64 expiredAt = 4; // 过期时间戳（可选）
	string reason = 5; // 加入理由（可选）
	string type = 6; // IP类型，值为ipv4或ipv6
	string eventLevel = 7; // 级别：debug, notice, warning, error, critical, fatal

	int64 nodeId = 8; // 可选项，所属节点ID
	int64 serverId = 9; // 可选项，所属网站ID

	int64 sourceNodeId = 10; // 可选项，来源节点
	int64 sourceServerId = 11;  // 可选项，来源网站ID
	int64 sourceHTTPFirewallPolicyId = 12; // 可选项，来源WAF策略ID
	int64 sourceHTTPFirewallRuleGroupId = 13; // 可选项，来源WAF规则分组ID
	int64 sourceHTTPFirewallRuleSetId = 14; // 可选项，来源WAF规则集ID
}

message CreateIPItemResponse {
	int64 ipItemId = 1;
}

// 创建一组IP
message CreateIPItemsRequest {
	repeated IPItem ipItems = 1; // 要创建的IP列表

	message IPItem {
		int64 ipListId = 1; // IP列表ID
		string ipFrom = 2; // 开始IP
		string ipTo = 3; // 结束IP（可选）
		int64 expiredAt = 4; // 过期时间戳（可选）
		string reason = 5; // 加入理由（可选）
		string type = 6; // 类型
		string eventLevel = 7; // 级别

		int64 nodeId = 8; // 所属节点ID
		int64 serverId = 9; // 所属服务ID

		int64 sourceNodeId = 10;
		int64 sourceServerId = 11;
		int64 sourceHTTPFirewallPolicyId = 12;
		int64 sourceHTTPFirewallRuleGroupId = 13;
		int64 sourceHTTPFirewallRuleSetId = 14;
	}
}

message CreateIPItemsResponse {
	repeated int64 ipItemIds = 1; // 创建后的IP ID列表
}

// 修改IP
message UpdateIPItemRequest {
	int64 ipItemId = 1;
	string ipFrom = 2;
	string ipTo = 3;
	int64 expiredAt = 4;
	string reason = 5;
	string type = 6; // 类型
	string eventLevel = 7; // 级别
}

// 删除IP
// 可以使用 ipItemId 删除，也可以使用 ipFrom+ipTo+ipListId 删除，如果只是单个IP，则不需要指定ipTo
message DeleteIPItemRequest {
	int64 ipItemId = 1; // IP条目的ID

	string ipFrom = 2; // v0.4.8新增，开始IP，和ipItemId二选一
	string ipTo = 3; // v0.4.8新增，结束IP，和ipItemId二选一
	int64 ipListId = 4; // v0.4.8新增，IP列表，IP所在的IP列表，如果不指定，则会删除所有IP列表中的相关IP信息
}

// 批量删除IP
message DeleteIPItemsRequest {
	repeated int64 ipItemIds = 1;
}

// 计算IP数量
message CountIPItemsWithListIdRequest {
	int64 ipListId = 1;
	string keyword = 2;
	string ipFrom = 3;
	string ipTo = 4;
	string eventLevel = 5;
}

// 列出单页的IP
message ListIPItemsWithListIdRequest {
	int64 ipListId = 1;
	string keyword = 4;
	string ipFrom = 5;
	string ipTo = 6;
	string eventLevel = 7;
	int64 offset = 2;
	int64 size = 3;
}

message ListIPItemsWithListIdResponse {
	repeated IPItem ipItems = 1;
}

// 查找单个IP
message FindEnabledIPItemRequest {
	int64 ipItemId = 1;
}

message FindEnabledIPItemResponse {
	IPItem ipItem = 1;
}

// 根据版本列出一组IP
message ListIPItemsAfterVersionRequest {
	int64 version = 1;
	int64 size = 2;
}

message ListIPItemsAfterVersionResponse {
	repeated IPItem ipItems = 1;
}

// 检查IP状态
message CheckIPItemStatusRequest {
	int64 ipListId = 1;
	string ip = 2;
}

message CheckIPItemStatusResponse {
	bool isOk = 1; // 是否查询成功
	string error = 2;
	bool isFound = 3; // 是否找到
	bool isAllowed = 4; // 是否允许
	IPItem ipItem = 5; // 匹配的IPItem
}

// 检查IP是否存在
message ExistsEnabledIPItemRequest {
	int64 ipItemId = 1;
}

message ExistsEnabledIPItemResponse {
	bool exists = 1;
}

// 计算所有IP数量
message CountAllEnabledIPItemsRequest {
	string keyword = 6; // 关键词
	string ip = 1; // 单个IP，搜索单个IP时需要
	bool globalOnly = 2; // 是否为自动添加的IP
	bool unread = 3; // 是否未读
	string eventLevel = 4; // 事件级别
	string listType = 5; // 列表类型：black|white
	int64 userId = 7; // 用户ID，只有管理员才有权限指定用户ID
}

// 列出所有名单中的IP
message ListAllEnabledIPItemsRequest {
	string keyword = 8; // 关键词
	string ip = 1; // 单个IP，搜索单个IP时需要
	bool globalOnly = 2;  // 是否为自动添加的IP
	bool unread = 5; // 是否未读
	string eventLevel = 6; // 事件级别
	string listType = 7; // 列表类型：black|white
	int64 userId = 9; // 用户ID，只有管理员才有权限指定用户ID
	int64 offset = 3; // 读取位置，从0开始
	int64 size = 4; // 每次读取数量
}

message ListAllEnabledIPItemsResponse {
	repeated Result results = 1;

	message Result {
		IPList ipList = 1; // 所属名单
		IPItem ipItem = 2; // IP信息
		Server server = 3; // 所属服务
		HTTPFirewallPolicy httpFirewallPolicy = 4; // 所属WAF策略
	}
}

// 列出所有名单中的IP ID
message ListAllIPItemIdsRequest {
	string keyword = 8; // 关键词
	string ip = 1; // 单个IP，搜索单个IP时需要
	bool globalOnly = 2;  // 是否为自动添加的IP
	bool unread = 5; // 是否未读
	string eventLevel = 6; // 事件级别
	string listType = 7; // 列表类型：black|white
	int64 userId = 9; // 用户ID，只有管理员才有权限指定用户ID
	int64 offset = 3; // 读取位置，从0开始
	int64 size = 4; // 每次读取数量
}

message ListAllIPItemIdsResponse {
	repeated int64 ipItemIds = 1; // IP ID列表
}

// 设置所有为已读
message UpdateIPItemsReadRequest {

}

// 查找IP对应的名单所属网站ID
message FindServerIdWithIPItemIdRequest {
	int64 ipItemId = 1; // IP ID
}

message FindServerIdWithIPItemIdResponse {
	int64 serverId = 1; // 网站ID
}