| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- namespace App\Models;
- use CodeIgniter\Model;
- class UserModel extends Model
- {
- protected $table = 'USER_LIST';
- protected $primaryKey = 'SEQ';
- protected $useAutoIncrement = true;
- protected $returnType = 'array';
- protected $useSoftDeletes = false;
-
- protected $allowedFields = [
- 'ID',
- 'PASSWORD',
- 'NICK_NAME',
- 'EMAIL',
- 'PHONE',
- 'MEMBER_TYPE',
- 'STATUS',
- 'LAST_LOGIN_DATE',
- 'IS_ACT',
- 'REG_DATE',
- 'MOD_DATE',
- // 인플루언서 관련 필드들
- 'INFLUENCER_TYPE',
- 'PRIMARY_CATEGORY',
- 'FOLLOWER_COUNT',
- 'AVG_VIEWS',
- 'PROFILE_IMAGE',
- 'BIO',
- 'INSTAGRAM_URL',
- 'YOUTUBE_URL',
- 'TIKTOK_URL',
- 'BLOG_URL',
- 'PREFERRED_REGION',
- 'MIN_COMMISSION_RATE',
- 'VERIFICATION_STATUS',
- 'VERIFIED_DATE'
- ];
-
- protected $useTimestamps = true;
- protected $createdField = 'REG_DATE';
- protected $updatedField = 'MOD_DATE';
-
- protected $validationRules = [
- 'ID' => '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;
- }
- }
|