require 'erb' #require 'helix_web_services_client/models' require 'helix_versioning_engine/change_service' require 'helix_versioning_engine/file_service' require 'projects/errors/illegal_project_structure' module Projects # Handles access to project metadata class ProjectService # Rack environment attr_accessor :env # TODO how do we provide context information, via the env? def initialize(env: nil) @env = env end @@append_to_list = [] @@fetch_project = [] # Register a callback method to implement listing projects in your system. # # Each callback takes three parameters: # # - `details` [Boolean]: If `true`, you should include the entire project JSON. # If `false`, you should only return an array of project IDs. # # - `extension` [String]: If set, we're only looking for projects that provide this extension. # (If it's set, and you know you don't provide this extension, then return nil.) # # - `env` [Hash]: The current Rack environment # # Example: # # Projects::ProjectService.append_to_list << lambda do |details, extension, env| # return unless i_provide?(extension) # puts "S'up user #{env['AUTH_CREDENTIALS'].first}" # if details # go_get_projects(env) # else # go_get_project_ids(env) # end # end def self.append_to_list @@append_to_list end # Iterate through the append_to_list handlers and return all projects def list(details: false, extension: nil) projects = [] @@append_to_list.each do |handler| to_append = handler.call(details, extension, env) projects.concat(to_append) if to_append end projects end # Register a callback method that can fetch project details given a project id. # # Your callback will take two paramters: # # - `id` [String] - The project ID # # - `env` [Hash] - The current rack environment # # Example: # # Projects::ProjectService.fetch_project << lambda do |id, env| # have_project?(id) ? get_project(id, env) : nil # end def self.fetch_project @@fetch_project end # Iterate through our handlers and return the first one that actually has a project def fetch(id) for handler in @@fetch_project p = handler.call(id, env) return p if p end return nil end end end