Class: Collavre::Creatives::PermissionChecker

Inherits:
Object
  • Object
show all
Defined in:
app/services/collavre/creatives/permission_checker.rb

Instance Method Summary collapse

Constructor Details

#initialize(creative, user) ⇒ PermissionChecker

Returns a new instance of PermissionChecker.



4
5
6
7
# File 'app/services/collavre/creatives/permission_checker.rb', line 4

def initialize(creative, user)
  @creative = creative
  @user = user
end

Instance Method Details

#allowed?(required_permission = :read) ⇒ Boolean

Returns:

  • (Boolean)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/services/collavre/creatives/permission_checker.rb', line 9

def allowed?(required_permission = :read)
  base = creative.origin_id.nil? ? creative : creative.origin

  # Owner always has admin permission (fallback for fixtures and missing cache entries)
  return true if base.user_id == user&.id

  # O(1) 캐시 테이블 조회
  # 사용자별 엔트리를 먼저 확인 (no_access가 public share보다 우선)
  if user
    user_entry = CreativeSharesCache.find_by(creative_id: base.id, user_id: user.id)
    if user_entry
      # no_access는 명시적 거부 - public share가 있어도 차단
      return false if user_entry.no_access?
      return permission_rank(user_entry.permission) >= permission_rank(required_permission)
    end
  end

  # 사용자별 엔트리 없으면 public share 확인
  public_entry = CreativeSharesCache.find_by(creative_id: base.id, user_id: nil)
  return false unless public_entry

  permission_rank(public_entry.permission) >= permission_rank(required_permission)
end