using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using ChatworkBulkSender.Utils;
namespace ChatworkBulkSender.Utils
{
/// <summary>
/// バリデーション処理の共通定義静的クラス
/// </summary>
public static class ValidationHelperUtil
{
/// <summary>
/// APIトークンの形式をチェック
/// </summary>
/// <param name="apiToken">APIトークン</param>
/// <returns>有効な形式の場合true</returns>
public static bool IsValidApiToken(string apiToken)
{
if (string.IsNullOrEmpty(apiToken))
return false;
// 英小文字と数字の組み合わせ(1~100文字)
return Regex.IsMatch(apiToken, Constants.API_TOKEN_PATTERN);
}
/// <summary>
/// ルームIDの形式をチェック
/// </summary>
/// <param name="roomId">ルームID</param>
/// <returns>有効な形式の場合true</returns>
public static bool IsValidRoomId(string roomId)
{
if (string.IsNullOrEmpty(roomId))
return false;
// 1〜10桁の数値
return Regex.IsMatch(roomId, Constants.ROOM_ID_PATTERN);
}
/// <summary>
/// アカウントIDの形式をチェック
/// </summary>
/// <param name="accountId">アカウントID</param>
/// <returns>有効な形式の場合true</returns>
public static bool IsValidAccountId(string accountId)
{
if (string.IsNullOrEmpty(accountId))
return false;
// 1〜10桁の数値
return Regex.IsMatch(accountId, Constants.ACCOUNT_ID_PATTERN);
}
/// <summary>
/// 文字数チェック用のエラーメッセージを生成
/// </summary>
/// <param name="fieldName">フィールド名</param>
/// <param name="currentLength">現在の文字数</param>
/// <param name="maxLength">最大文字数</param>
/// <returns>エラーメッセージ</returns>
public static string GetLengthErrorMessage(string fieldName, int currentLength, int maxLength)
{
return $"{fieldName}は{maxLength}文字以内で入力してください。(現在:{currentLength}文字)";
}
/// <summary>
/// APIトークンの形式エラーメッセージを取得
/// </summary>
/// <returns>エラーメッセージ</returns>
public static string GetApiTokenFormatErrorMessage()
{
return "APIトークンは32文字の16進数(0-9, a-f)で入力してください。";
}
/// <summary>
/// ルームIDの形式エラーメッセージを取得
/// </summary>
/// <param name="fieldName">フィールド名(「ルームID」または「テストルームID」など)</param>
/// <returns>エラーメッセージ</returns>
public static string GetRoomIdFormatErrorMessage(string fieldName)
{
return $"{fieldName}は20桁以内の数値で入力してください。";
}
/// <summary>
/// アカウントIDの形式エラーメッセージを取得
/// </summary>
/// <param name="fieldName">フィールド名(「宛先アカウントID」など)</param>
/// <returns>エラーメッセージ</returns>
public static string GetAccountIdFormatErrorMessage(string fieldName)
{
return $"{fieldName}は20桁以内の数値で入力してください。";
}
/// <summary>
/// カンマ区切りのアカウントIDリストを検証
/// </summary>
/// <param name="accountIds">カンマ区切りのアカウントID</param>
/// <param name="invalidIds">無効なIDのリスト(出力)</param>
/// <returns>すべて有効な場合true</returns>
public static bool ValidateAccountIdList(string accountIds, out string[] invalidIds)
{
invalidIds = null;
if (string.IsNullOrWhiteSpace(accountIds))
return true; // 空の場合は有効とする
var ids = accountIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var invalidList = new System.Collections.Generic.List<string>();
foreach (var id in ids)
{
var trimmedId = id.Trim();
if (!IsValidAccountId(trimmedId))
{
invalidList.Add(trimmedId);
}
}
if (invalidList.Count > 0)
{
invalidIds = invalidList.ToArray();
return false;
}
return true;
}
/// <summary>
/// 管理番号の形式をチェック
/// </summary>
/// <param name="managementNumber">管理番号</param>
/// <returns>有効な形式の場合true</returns>
public static bool IsValidManagementNumber(string managementNumber)
{
if (string.IsNullOrEmpty(managementNumber))
return false;
// 数値のみ(1以上の整数)
if (int.TryParse(managementNumber, out int number))
{
return number > 0;
}
return false;
}
/// <summary>
/// 管理番号のエラーメッセージを取得
/// </summary>
/// <returns>エラーメッセージ</returns>
public static string GetManagementNumberFormatErrorMessage()
{
return "管理番号は1以上の半角数字で入力してください。";
}
/// <summary>
/// 並び順の形式をチェック
/// </summary>
/// <param name="sortOrder">並び順</param>
/// <returns>有効な形式の場合true</returns>
public static bool IsValidSortOrder(string sortOrder)
{
if (string.IsNullOrEmpty(sortOrder))
return false;
// 数値のみ(1以上の整数)
if (int.TryParse(sortOrder, out int number))
{
return number > 0;
}
return false;
}
/// <summary>
/// 並び順のエラーメッセージを取得
/// </summary>
/// <returns>エラーメッセージ</returns>
public static string GetSortOrderFormatErrorMessage()
{
return "並び順は1以上の半角数字で入力してください。";
}
}
}