'required|max_length[50]|is_unique[USER_LIST.ID,SEQ,{SEQ}]', 'PASSWORD' => 'required|min_length[8]', 'NICK_NAME' => 'required|max_length[100]', 'EMAIL' => 'required|valid_email|is_unique[USER_LIST.EMAIL,SEQ,{SEQ}]', 'PHONE' => 'permit_empty|max_length[20]', 'MEMBER_TYPE' => 'required|in_list[ADMIN,INFLUENCER,VENDOR]', 'STATUS' => 'required|in_list[ACTIVE,INACTIVE,SUSPENDED,PENDING]', 'IS_ACT' => 'required|in_list[Y,N]', 'INFLUENCER_TYPE' => 'permit_empty|in_list[MACRO,MICRO,NANO,MEGA]', 'PRIMARY_CATEGORY' => 'permit_empty|in_list[FASHION_BEAUTY,FOOD_HEALTH,LIFESTYLE,TECH_ELECTRONICS,SPORTS_LEISURE,CULTURE_ENTERTAINMENT]', 'FOLLOWER_COUNT' => 'permit_empty|integer|greater_than_equal_to[0]', 'AVG_VIEWS' => 'permit_empty|integer|greater_than_equal_to[0]', 'PREFERRED_REGION' => 'permit_empty|in_list[SEOUL,GYEONGGI,INCHEON,BUSAN,DAEGU,DAEJEON,GWANGJU,ULSAN,OTHER]', 'MIN_COMMISSION_RATE' => 'permit_empty|decimal|greater_than_equal_to[0]|less_than_equal_to[100]', 'VERIFICATION_STATUS' => 'permit_empty|in_list[UNVERIFIED,PENDING,VERIFIED,REJECTED]' ]; protected $validationMessages = [ 'ID' => [ 'required' => '아이디는 필수입니다.', 'max_length' => '아이디는 50자를 초과할 수 없습니다.', 'is_unique' => '이미 사용 중인 아이디입니다.' ], 'PASSWORD' => [ 'required' => '비밀번호는 필수입니다.', 'min_length' => '비밀번호는 최소 8자 이상이어야 합니다.' ], 'NICK_NAME' => [ 'required' => '닉네임은 필수입니다.', 'max_length' => '닉네임은 100자를 초과할 수 없습니다.' ], 'EMAIL' => [ 'required' => '이메일은 필수입니다.', 'valid_email' => '유효한 이메일 형식이 아닙니다.', 'is_unique' => '이미 사용 중인 이메일입니다.' ], 'MEMBER_TYPE' => [ 'required' => '회원 유형은 필수입니다.', 'in_list' => '유효하지 않은 회원 유형입니다.' ], 'STATUS' => [ 'required' => '상태는 필수입니다.', 'in_list' => '유효하지 않은 상태입니다.' ], 'IS_ACT' => [ 'required' => '활성 상태는 필수입니다.', 'in_list' => '활성 상태는 Y 또는 N이어야 합니다.' ] ]; protected $skipValidation = false; protected $cleanValidationRules = true; /** * 인플루언서 목록 조회 */ public function getInfluencers($filters = [], $page = 1, $perPage = 12) { $builder = $this->where('MEMBER_TYPE', 'INFLUENCER') ->where('IS_ACT', 'Y') ->where('STATUS', 'ACTIVE'); // 키워드 검색 if (!empty($filters['keyword'])) { $builder->groupStart() ->like('NICK_NAME', $filters['keyword']) ->orLike('ID', $filters['keyword']) ->groupEnd(); } // 카테고리 필터 if (!empty($filters['category'])) { $builder->where('PRIMARY_CATEGORY', $filters['category']); } // 인플루언서 타입 필터 if (!empty($filters['influencer_type'])) { $builder->where('INFLUENCER_TYPE', $filters['influencer_type']); } // 팔로워 수 범위 if (!empty($filters['follower_min'])) { $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']); } if (!empty($filters['follower_max'])) { $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']); } // 페이징 $offset = ($page - 1) * $perPage; return $builder->limit($perPage, $offset)->findAll(); } /** * 인플루언서 검색 결과 총 개수 */ public function countInfluencers($filters = []) { $builder = $this->where('MEMBER_TYPE', 'INFLUENCER') ->where('IS_ACT', 'Y') ->where('STATUS', 'ACTIVE'); // 키워드 검색 if (!empty($filters['keyword'])) { $builder->groupStart() ->like('NICK_NAME', $filters['keyword']) ->orLike('ID', $filters['keyword']) ->groupEnd(); } // 카테고리 필터 if (!empty($filters['category'])) { $builder->where('PRIMARY_CATEGORY', $filters['category']); } // 인플루언서 타입 필터 if (!empty($filters['influencer_type'])) { $builder->where('INFLUENCER_TYPE', $filters['influencer_type']); } // 팔로워 수 범위 if (!empty($filters['follower_min'])) { $builder->where('FOLLOWER_COUNT >=', $filters['follower_min']); } if (!empty($filters['follower_max'])) { $builder->where('FOLLOWER_COUNT <=', $filters['follower_max']); } return $builder->countAllResults(); } /** * 인플루언서 타입별 통계 */ public function getInfluencerTypeStats() { return $this->select('INFLUENCER_TYPE, COUNT(*) as count') ->where('MEMBER_TYPE', 'INFLUENCER') ->where('IS_ACT', 'Y') ->where('STATUS', 'ACTIVE') ->groupBy('INFLUENCER_TYPE') ->findAll(); } /** * 카테고리별 인플루언서 통계 */ public function getInfluencerCategoryStats() { return $this->select('PRIMARY_CATEGORY, COUNT(*) as count') ->where('MEMBER_TYPE', 'INFLUENCER') ->where('IS_ACT', 'Y') ->where('STATUS', 'ACTIVE') ->groupBy('PRIMARY_CATEGORY') ->findAll(); } /** * 사용자 로그인 */ public function authenticate($id, $password) { $user = $this->where('ID', $id) ->where('IS_ACT', 'Y') ->first(); if ($user && password_verify($password, $user['PASSWORD'])) { // 로그인 날짜 업데이트 $this->update($user['SEQ'], ['LAST_LOGIN_DATE' => date('Y-m-d H:i:s')]); return $user; } return false; } }