Class: CmisServer::DocumentAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/cmis_server/document_adapter.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, context:) ⇒ DocumentAdapter

Returns a new instance of DocumentAdapter.



5
6
7
8
# File 'lib/cmis_server/document_adapter.rb', line 5

def initialize(object, context:)
  @object = object
  @context = context
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



3
4
5
# File 'lib/cmis_server/document_adapter.rb', line 3

def context
  @context
end

#objectObject (readonly)

Returns the value of attribute object.



3
4
5
# File 'lib/cmis_server/document_adapter.rb', line 3

def object
  @object
end

Class Method Details

.class_adapter(context:) ⇒ Object



10
11
12
# File 'lib/cmis_server/document_adapter.rb', line 10

def self.class_adapter(context:)
  new(nil, context: context)
end

Instance Method Details

#add_content_stream(content_stream) ⇒ Object



47
48
49
# File 'lib/cmis_server/document_adapter.rb', line 47

def add_content_stream(content_stream)
  @content_stream = content_stream
end

#add_to_folder(folder) ⇒ Object



42
43
44
45
# File 'lib/cmis_server/document_adapter.rb', line 42

def add_to_folder(folder)
  # Store folder ID for when we save
  @parent_folder_id = folder.respond_to?(:cmis_object_id) ? folder.cmis_object_id : folder
end

#find(id) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/cmis_server/document_adapter.rb', line 14

def find(id)
  connector = CmisServer::Connectors::ConnectorFactory.create_connector(
    user: @context.is_a?(Hash) ? @context[:current_user] : @context.current_user
  )
  core_doc = connector.find_object_by_id(id)
  
  # Convertir le document Core en objet CMIS
  if core_doc
    # Créer un DocumentObject CMIS à partir du Doc Core
    doc_type = CmisServer::TypeRegistry.get_type('cmis:document')
    properties = {
      'cmis:objectId' => CmisServer::Property.new(id: 'cmis:objectId', value: core_doc.id.to_s),
      'cmis:objectTypeId' => CmisServer::Property.new(id: 'cmis:objectTypeId', value: 'cmis:document'),
      'cmis:name' => CmisServer::Property.new(id: 'cmis:name', value: core_doc.title),
      'cmis:createdBy' => CmisServer::Property.new(id: 'cmis:createdBy', value: core_doc.user&.full_name || 'Unknown'),
      'cmis:creationDate' => CmisServer::Property.new(id: 'cmis:creationDate', value: core_doc.created_at),
      'cmis:lastModificationDate' => CmisServer::Property.new(id: 'cmis:lastModificationDate', value: core_doc.updated_at)
    }
    
    cmis_doc = CmisServer::DocumentObject.new(type: doc_type, properties: properties)
    cmis_doc.cmis_object_id = core_doc.id.to_s
    
    self.class.new(cmis_doc, context: @context)
  else
    raise CmisServer::ObjectNotFound.new("Document with ID #{id} not found")
  end
end

#save!Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/cmis_server/document_adapter.rb', line 51

def save!
  
  # Créer un document Core
  doc = ::Doc.new
  
  # Mapper les propriétés CMIS vers Core
  if @object && @object.properties
    # Extraire les valeurs des objets Property
    name_value = @object.properties['cmis:name']
    name_value = name_value.value if name_value.respond_to?(:value)
    doc.title = name_value || 'Untitled'
    doc.labels = ['cmis']
    
    # Mapper les autres propriétés CMIS vers superfields
    superfields = {}
    @object.properties.each do |key, value|
      unless ['cmis:name', 'cmis:objectTypeId'].include?(key)
        # Extraire la valeur si c'est un objet Property
        actual_value = value.respond_to?(:value) ? value.value : value
        # Nettoyer la clé pour MongoDB (remplacer . et : par _)
        clean_key = key.gsub(/[.:]/, '_')
        # Convertir les IDs en string
        if actual_value.respond_to?(:to_s)
          superfields[clean_key] = actual_value.to_s
        else
          superfields[clean_key] = actual_value
        end
      end
    end
    doc.superfields = superfields unless superfields.empty?
  end
  
  # Ajouter le contenu si présent
  if @content_stream
    require 'base64'
    if @content_stream.base64
      doc.blob = Base64.decode64(@content_stream.base64)
    end
  end
  
  # Définir le responsable (obligatoire)
  if @context.current_user
    # Si l'utilisateur est déjà un objet User de Core, l'utiliser directement
    if @context.current_user.is_a?(::User)
      doc.responsible = @context.current_user.id.to_s
      Rails.logger.debug "Setting document responsible to Core user: #{doc.responsible}"
    else
      Rails.logger.error "Current user is not a Core User: #{@context.current_user.class.name}"
      raise "Invalid user type for document creation"
    end
  else
    Rails.logger.warn "No current_user available in context!"
    raise "No authenticated user for document creation"
  end
  
  # Ajouter aux espaces (folders)
  if @parent_folder_id
    # Si c'est root_folder, on ne fait rien
    unless @parent_folder_id == 'root_folder'
      # Sinon on ajoute le document à l'espace correspondant
      doc.tagset_ids = [@parent_folder_id]
    end
  end
  
  
  # Sauvegarder le document
  if doc.save
    # Mettre à jour l'objet CMIS avec l'ID du document créé
    @object.cmis_object_id = doc.id.to_s if @object
    true
  else
    Rails.logger.error "DocumentAdapter#save! - Failed to save document: #{doc.errors.full_messages.join(', ')}"
    raise "Failed to save document: #{doc.errors.full_messages.join(', ')}"
  end
rescue => e
  Rails.logger.error "DocumentAdapter#save! - Exception: #{e.class.name} - #{e.message}"
  Rails.logger.error e.backtrace.first(5).join("\n")
  raise e
end

#to_renderable_objectObject



131
132
133
# File 'lib/cmis_server/document_adapter.rb', line 131

def to_renderable_object
  CmisServer::RenderableObject.new(base_object: @object)
end