cloudspokes/cs-website-cms

View on GitHub
app/models/submission.rb

Summary

Maintainability
A
20 mins
Test Coverage
#class Submission < Hashie::Mash
  #extend ActiveModel::Naming
class Submission < ApiModel

  def self.api_endpoint
    "challenges"
  end

  LANGUAGES = %w{Node Java JavaScript Ruby Python Apex Other}
  PAAS = ["Heroku", "Salesforce.com", "CloudFoundry", "Google App Engine", "Other"]
  APIS = ["DocuSign REST API", "FullContact", "Google Chart Tools", "Twilio", "Other"]
  TECHNOLOGIES = ["redis", "mongodb", "rabbitmq", "Other"]

  attr_accessor :id, :apis, :paas, :languages, :technologies, :submission_overview, :deliverables,
                :challenge_id, :username, :participant, :next_deliverable_id

  class << self
    def find(challenge_id, username)
      puts challenge_id

      challenge_id = challenge_id
      username = username

      participant = Participant.find_by_member(challenge_id, username)
      deliverables = participant.submission_deliverables

      attrs = {
        :apis => participant.apis||[], 
        :paas => participant.paas||[], 
        :languages => participant.languages||[], 
        :technologies => participant.technologies||[],
        :submission_overview => participant.submission_overview,
        :deliverables => deliverables,
        :next_deliverable_id => deliverables.length || 1
      }

      submission = new attrs.merge(username: username, challenge_id: challenge_id, participant: participant)
      submission
    end

    def save
      puts "save"
    end    

    def storage
      @storage ||= begin
        fog = Fog::Storage.new(
          :provider                 => 'AWS',
          :aws_secret_access_key    => ENV['AWS_SECRET'],
          :aws_access_key_id        => ENV['AWS_KEY']
        )
        fog.directories.get(ENV['AWS_BUCKET'])
      end
    end
  end

  def update(attrs)
    attrs.each do |k, v|
      if v.kind_of?(Array) and v[0] == ""
        attrs[k].shift
      end
    end

    fields = {
      submission_overview: attrs["submission_overview"],
      apis: attrs["apis"].join(";"),
      paas: attrs["paas"].join(";"),
      languages: attrs["languages"].join(";"),
      technologies: attrs["technologies"].join(";")
    }

    self.class.http_put "participants/#{username}/#{challenge_id}", {'fields' => fields}
  rescue Exception => e
    puts e.message    
  end

  def destroy
    puts "destroy"
  end


  def create_deliverable(attrs)
    deliverable = SubmissionDeliverable.new
    deliverable.type = attrs[:type]
    deliverable.comments = attrs[:comments]
    deliverable.url = attrs[:url]
    deliverable.hosting_platform = attrs[:hosting_platform]
    deliverable.language = attrs[:language]
    #deliverable.source = attrs[:source] # this was throwing an error
    puts deliverable.to_yaml

    # assign a uniq deliverable id
    # deliverable.id = next_deliverable_id
    # self.next_deliverable_id += 1

    # create the new deliverable record
    deliverable = self.class.http_post "participants/#{username}/#{challenge_id}/deliverable", {data: deliverable}
    self.deliverables << deliverable
    puts deliverables
    deliverable
  rescue Exception => e
    puts e.message
  end

  def find_deliverable(deliverable_id)
    deliverables.detect {|d| d.id == deliverable_id}
  end

  def delete_deliverable(deliverable_id)
    fields = {
      id: deliverable_id,
      deleted: true
    }
    self.class.http_put "participants/#{username}/#{challenge_id}/deliverable", {'fields' => fields}
  end

  def destroy_deliverable(deliverable_id)

    deliverable = find_deliverable(deliverable_id)
    deliverable = deliverable.raw_data

    # after destroying the deliverable file, delete the deliverable entry too
    delete_deliverable(deliverable_id)

    deliverable
  end

  def upload_file(file)
    file = storage.files.create(
      :key    => storage_path(File.basename(file.original_filename)),
      :body   => file.read,
      :public => true
    )

    create_deliverable type: "Code", hosting_platform: "Other", language: "Other", url: file.key, source: "storage"
  end

  private
    
    def storage
      self.class.storage
    end
    
    def storage_path(name)
      "challenges/#{challenge_id}/#{username}/#{name}"
    end
end