require_relative '../lib/familia'
require_relative '../lib/familia/features/relationships/score_encoding'
require_relative '../lib/familia/features/relationships/permission_management'
class User < Familia::Horreum
logical_database 14
identifier_field :user_id
field :user_id
field :email
field :name
field :role field :created_at
sorted_set :documents sorted_set :recent_activity end
class Document < Familia::Horreum
include Familia::Features::Relationships::PermissionManagement
logical_database 14
permission_tracking :user_permissions
identifier_field :doc_id
field :doc_id
field :title
field :owner_id
field :content
field :created_at
field :updated_at
field :document_type
sorted_set :collaborators list :audit_log
def share_with_user(user, *permissions)
permissions = [:read] if permissions.empty?
timestamp = updated_at || Time.now
score = Familia::Features::Relationships::ScoreEncoding.encode_score(timestamp, permissions)
user.documents.add(score, doc_id)
collaborators.add(score, user.user_id)
grant(user, *permissions)
log_entry = "#{Time.now.iso8601}: Granted #{permissions.join(', ')} to #{user.email}"
audit_log.push(log_entry)
end
def revoke_access(user)
user.documents.zrem(doc_id)
collaborators.zrem(user.user_id)
revoke(user, :read, :write, :edit, :delete, :configure, :transfer, :admin)
log_entry = "#{Time.now.iso8601}: Revoked all access from #{user.email}"
audit_log.push(log_entry)
end
def users_with_permission(*required_permissions)
all_permissions.select do |_user_id, user_perms|
required_permissions.all? { |perm| user_perms.include?(perm) }
end.keys
end
def access_analytics(days_back = 30)
start_time = Time.now - (days_back * 24 * 60 * 60)
end_time = Time.now
range = Familia::Features::Relationships::ScoreEncoding.score_range(
start_time,
end_time,
min_permissions: [:read]
)
active_users = collaborators.rangebyscore(*range)
{
active_users: active_users,
total_collaborators: collaborators.size,
permission_breakdown: all_permissions,
audit_entries: audit_log.range(0, 50),
}
end
end
class DocumentService
ROLE_PERMISSIONS = {
guest: [:read],
viewer: [:read],
commenter: %i[read append],
editor: %i[read write edit],
reviewer: %i[read write edit delete],
admin: %i[read write edit delete configure transfer admin],
}.freeze
def self.create_document(owner, title, content, doc_type = 'private')
doc = Document.new(
doc_id: "doc_#{Time.now.to_i}_#{rand(1000)}",
title: title,
content: content,
owner_id: owner.user_id,
document_type: doc_type,
created_at: Time.now,
updated_at: Time.now
)
doc.share_with_user(owner, *ROLE_PERMISSIONS[:admin])
doc
end
def self.share_document(document, user, role)
permissions = ROLE_PERMISSIONS[role] || ROLE_PERMISSIONS[:viewer]
document.share_with_user(user, *permissions)
end
def self.can_user_perform?(user, document, action)
case action
when :view, :read
document.can?(user, :read)
when :comment, :append
document.can?(user, :read, :append)
when :edit, :modify
document.can?(user, :read, :write, :edit)
when :delete, :remove
document.can?(user, :delete)
when :share, :configure
document.can?(user, :configure)
when :transfer_ownership
document.can?(user, :admin)
else
false
end
end
def self.bulk_permission_update(documents, users, role)
permissions = ROLE_PERMISSIONS[role]
documents.each do |doc|
users.each do |user|
doc.revoke_access(user) doc.share_with_user(user, *permissions) if permissions
end
end
end
end
if __FILE__ == $0
puts '๐ Familia Bit Encoding Integration Example'
puts '=' * 50
alice = User.new(user_id: 'alice', email: 'alice@company.com', name: 'Alice Smith', role: 'admin')
bob = User.new(user_id: 'bob', email: 'bob@company.com', name: 'Bob Jones', role: 'editor')
charlie = User.new(user_id: 'charlie', email: 'charlie@company.com', name: 'Charlie Brown', role: 'viewer')
doc1 = DocumentService.create_document(alice, 'Q4 Financial Report', 'Confidential financial data...', 'confidential')
doc2 = DocumentService.create_document(alice, 'Team Meeting Notes', 'Weekly standup notes...', 'private')
doc3 = DocumentService.create_document(bob, 'Project Proposal', 'New feature proposal...', 'public')
puts "\n๐ Document Sharing:"
DocumentService.share_document(doc1, bob, :reviewer) DocumentService.share_document(doc1, charlie, :viewer)
DocumentService.share_document(doc2, bob, :editor) DocumentService.share_document(doc2, charlie, :commenter)
DocumentService.share_document(doc3, alice, :admin) DocumentService.share_document(doc3, charlie, :editor)
puts "\n๐ Permission Testing:"
puts "Can Bob edit financial report? #{DocumentService.can_user_perform?(bob, doc1, :edit)}"
puts "Can Bob delete financial report? #{DocumentService.can_user_perform?(bob, doc1, :delete)}"
puts "Can Charlie comment on meeting notes? #{DocumentService.can_user_perform?(charlie, doc2, :comment)}"
puts "Can Charlie edit project proposal? #{DocumentService.can_user_perform?(charlie, doc3, :edit)}"
puts "\n๐ Document Analytics:"
analytics = doc1.access_analytics
puts "Financial Report - Active Users: #{analytics[:active_users].size}"
puts "Total Collaborators: #{analytics[:total_collaborators]}"
puts 'Permission Breakdown:'
analytics[:permission_breakdown].each do |user_id, perms|
puts " #{user_id}: #{perms.join(', ')}"
end
puts "\nโก Bit Encoding Efficiency:"
score = Familia::Features::Relationships::ScoreEncoding.encode_score(Time.now, %i[read write edit delete])
decoded = Familia::Features::Relationships::ScoreEncoding.decode_score(score)
puts "Encoded score: #{score}"
puts "Decoded permissions: #{decoded[:permission_list].join(', ')}"
puts "Permission bits: #{decoded[:permissions]} (#{decoded[:permissions].to_s(2).rjust(8, '0')})"
puts "\n๐งน Cleanup:"
[alice, bob, charlie].each { |user| user.documents.clear }
[doc1, doc2, doc3].each do |doc|
doc.clear_all_permissions
doc.collaborators.clear
end
puts 'โ
Integration example completed successfully!'
puts "\nThis demonstrates:"
puts 'โข Fine-grained permission management with 8-bit encoding'
puts 'โข Role-based access control with business logic'
puts 'โข Time-based analytics and audit trails'
puts 'โข Efficient Redis storage with sorted sets'
puts 'โข Production-ready error handling and validation'
end