Class: CmisServer::Connectors::CoreConnector

Inherits:
BaseConnector show all
Defined in:
lib/cmis_server/connectors/core_connector.rb

Instance Method Summary collapse

Methods inherited from BaseConnector

#initialize

Constructor Details

This class inherits a constructor from CmisServer::Connectors::BaseConnector

Instance Method Details

#create_document(properties, folder_id: nil, content_stream: nil) ⇒ Object



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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/cmis_server/connectors/core_connector.rb', line 103

def create_document(properties, folder_id: nil, content_stream: nil)
  
  # Extraire les propriétés CMIS
  # Les propriétés peuvent être soit des strings soit des objets Property
  doc_name = properties['cmis:name']
  doc_name = doc_name.respond_to?(:value) ? doc_name.value : doc_name
  
  doc_title = doc_name || 'Untitled'
  
  doc_description = properties['cmis:description']
  doc_description = doc_description.respond_to?(:value) ? doc_description.value : doc_description
  doc_description ||= ''
  
  # Déterminer l'espace parent
  space_id = if folder_id && folder_id != 'root_folder'
    folder_id
  else
    # Si pas de folder_id ou si c'est le root, utiliser le premier espace favori
    favorite_spaces = find_folders({ 'favorite' => true })
    if favorite_spaces.any?
      favorite_spaces.first.id.to_s
    else
      raise "No favorite space found to create document"
    end
  end
  
  
  # Créer le document dans Core
  if doc_class
    doc = doc_class.new
    doc.title = doc_title
    doc.description = doc_description if doc.respond_to?(:description=)
    doc.tagset_ids = [BSON::ObjectId(space_id)] if doc.respond_to?(:tagset_ids=)
    doc.user = core_user
    
    # Gérer le contenu si présent
    if content_stream && doc.respond_to?(:content=)
      doc.content = content_stream.content
      doc.content_type = content_stream.mime_type if doc.respond_to?(:content_type=)
    end
    
    if doc.save
      doc.id.to_s
    else
      Rails.logger.error "CoreConnector: Failed to save document: #{doc.errors.full_messages.join(', ')}"
      raise "Failed to create document: #{doc.errors.full_messages.join(', ')}"
    end
  else
    raise "Doc class not available in Core"
  end
end

#create_folder(properties, parent_folder_id: nil) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/cmis_server/connectors/core_connector.rb', line 155

def create_folder(properties, parent_folder_id: nil)
  
  # Extraire les propriétés CMIS
  folder_name = properties['cmis:name']
  folder_name = folder_name.respond_to?(:value) ? folder_name.value : folder_name
  folder_name ||= 'Untitled Folder'
  
  folder_description = properties['cmis:description']
  folder_description = folder_description.respond_to?(:value) ? folder_description.value : folder_description
  folder_description ||= ''
  
  # Créer un Tagset (espace) dans Core
  if ::Tagset
    tagset = ::Tagset.new
    tagset.title = folder_name
    tagset.description = folder_description if tagset.respond_to?(:description=)
    tagset.is_space = true if tagset.respond_to?(:is_space=)
    tagset.responsible = core_user.id.to_s if tagset.respond_to?(:responsible=) && core_user
    
    # Gérer la hiérarchie si un parent est spécifié
    if parent_folder_id && parent_folder_id != 'root_folder'
      tagset.parent_ids = [BSON::ObjectId(parent_folder_id)] if tagset.respond_to?(:parent_ids=)
    end
    
    if tagset.save
      tagset.id.to_s
    else
      Rails.logger.error "CoreConnector: Failed to save folder: #{tagset.errors.full_messages.join(', ')}"
      raise "Failed to create folder: #{tagset.errors.full_messages.join(', ')}"
    end
  else
    raise "Tagset class not available in Core"
  end
end

#delete_object(object_id) ⇒ Object



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# File 'lib/cmis_server/connectors/core_connector.rb', line 190

def delete_object(object_id)
  
  # Essayer de trouver l'objet
  object = find_object_by_id(object_id)
  unless object
    raise CmisServer::ObjectNotFound.new("Object '#{object_id}' not found")
  end
  
  # Supprimer selon le type
  if doc_class && object.is_a?(doc_class)
    # Définir l'utilisateur courant pour la traçabilité
    object.current_user_id = core_user.id if object.respond_to?(:current_user_id=) && core_user
    object.destroy
  elsif object.respond_to?(:destroy) && object.class.name == 'Doc'
    # Fallback si doc_class n'est pas trouvé mais que c'est bien un Doc
    object.current_user_id = core_user.id if object.respond_to?(:current_user_id=) && core_user
    object.destroy
  elsif object.is_a?(::Tagset) || (object.respond_to?(:is_space) && object.is_space)
    # Pour les espaces/tagsets aussi si nécessaire
    object.current_user_id = core_user.id if object.respond_to?(:current_user_id=) && core_user
    object.destroy
  else
    raise "Cannot delete object of type #{object.class}"
  end
end

#find_documents(conditions = {}) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/cmis_server/connectors/core_connector.rb', line 7

def find_documents(conditions = {})
  return [] unless search_service_available?
  return [] unless core_user # Pas de recherche sans utilisateur valide
  
  begin
    # Convertir les conditions CMIS en paramètres Core search
    search_params = convert_cmis_to_docs_search_params(conditions)
    
    # Créer le service de recherche avec les paramètres convertis et l'utilisateur Core
    search_service = docs_search_class.new(search_params, user: core_user)
    
    # Exécuter la recherche et retourner les résultats paginés (query Mongo)
    documents = search_service.search
    
    documents
  rescue => e
    Rails.logger.error "CoreConnector find_documents error: #{e.message}"
    Rails.logger.error "CoreConnector find_documents backtrace: #{e.backtrace.first(5)}"
    []
  end
end

#find_folders(conditions = {}) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/cmis_server/connectors/core_connector.rb', line 29

def find_folders(conditions = {})
  
  return [] unless core_user # Pas de recherche sans utilisateur valide
  
  begin
    # Cas spécial : recherche des sous-espaces d'un parent
    if conditions['parent_id'] && defined?(::Tagset)
      parent_id = conditions['parent_id']
      
      # Rechercher directement les Tagsets qui ont ce parent
      tagsets = ::Tagset.where(parent_ids: parent_id, is_space: true)
      return tagsets
    end
    
    # Pour les autres cas, utiliser SpacesSearch si disponible
    return [] unless search_service_available?
    
    # Convertir les conditions CMIS en paramètres Core search
    search_params = convert_cmis_to_spaces_search_params(conditions)
    
    # Créer le service de recherche avec les paramètres convertis et l'utilisateur Core
    search_service = spaces_search_class.new(search_params, user: core_user)
    
    # Exécuter la recherche et retourner les résultats paginés (query Mongo)
    folders = search_service.search
    
    folders
  rescue => e
    Rails.logger.error "CoreConnector find_folders error: #{e.message}"
    Rails.logger.error "CoreConnector find_folders backtrace: #{e.backtrace.first(5)}"
    []
  end
end

#find_object_by_id(id) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/cmis_server/connectors/core_connector.rb', line 63

def find_object_by_id(id)
  
  # Cas spécial pour le dossier racine CMIS (accepter plusieurs variantes)
  if id == 'core_root' || id == 'root_folder' || id == 'root' || id == 'root_folder_id'
    return create_root_folder_object
  end
  
  # Essayer d'abord comme document
  doc = find_document_by_id(id)
  if doc
    return doc
  end
  
  # Puis essayer comme dossier/espace
  folder = find_folder_by_id(id)
  if folder
    return folder
  end
  
  Rails.logger.warn "CoreConnector: No object found with ID: #{id}"
  nil
end

#find_object_by_path(path) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/cmis_server/connectors/core_connector.rb', line 86

def find_object_by_path(path)
  
  # Cas spécial pour le path racine
  if path == '/' || path.blank?
    return create_root_folder_object
  end
  
  # Pour les autres paths, chercher dans les espaces Core
  # TODO: implémenter la recherche par path dans les espaces
  find_folders({ path: path }).first
end

#find_root_foldersObject



98
99
100
101
# File 'lib/cmis_server/connectors/core_connector.rb', line 98

def find_root_folders
  # Retourner les espaces favoris comme enfants directs du root
  find_folders({ 'favorite' => true })
end