Report abuse

require 'uuidtools'

class Media < Application

  before :login_required
  before :localize_methods, :only => [:new]
  before :cleanse_empty_data_references, :only => [:create]

  # This default action (see router.rb) is just fodder to feed our redirect.
  # no one should be doing anything here except uploading.
  def index
    MERB_LOGGER.info('--BAD-URI')
    redirect 'http://api.jamlab.com/'
  end

  # GET /media/new
  def new
    @upid = UUID.random_create.to_s
    render
  end

  # POST /media
  # POST /media.xml
  def create
    @media = [params[:medium].delete(:data)].flatten
    @media.map! do |medium|
      Medium.new(medium.update(params[:medium])).to_hash
    end
    relay = MediaRelay.new(@media, :cookies => {_session_id_key => cookies[_session_id_key]})
    @media = relay.response
    respond_to do |format|
      if relay.success?
        format.html { redirect(base_url(params[:medium][:project_id])) }
        format.js   { redirect(finish_url(params[:medium][:project_id])) }
        format.xml  { success_headers(@media, :xml);  @media.to_xml }
        format.yaml { success_headers(@media, :yaml); @media.to_yaml }
        format.plist{ success_headers(@media, :plist);@media.to_plist }
      else
        session['flash'][:warning] = "#{relay.status} #{relay.reason}" if session["flash"]
        format.html { redirect request.env['HTTP_REFERER'] || Merb::Server.config[:jamlab_uri] }
        format.xml  { @media.to_xml }
        format.yaml { @media.to_yaml }
        format.plist{ @media.to_plist }
      end
    end
  end

  def progress
    # Mongrel::Uploads.debug = true
    @upstatus = Mongrel::Uploads.check(params[:upload_id])
    finishing = Mongrel::Uploads.instance_variable_get(:@counters)
    return if @upstatus.nil? && finishing && !finishing.empty?
    respond_to do |format|
      format.yaml { @upstatus.to_yaml }
      format.js   { render_js 'progress' }
    end
  end

  protected

    def cleanse_empty_data_references
      params[:medium][:data].delete("")
    end

    def base_url(project_id)
      "http://#{Merb::Server.config[:jamlab_uri]}/projects/#{project_id}/versions"
    end

    def finish_url(project_id)
      "http://#{Merb::Server.config[:jamlab_uri]}/projects/#{project_id}/media/finish"
    end

    def success_headers(media,format)
      headers['Location'] = media.to_a.map{ |medium| location(medium,format) }.join(', ')
      @status = 201
    end

    def location(medium,format=nil)
      "#{base_url(params[:medium][:project_id])}/#{medium.id}#{format ? ".#{format}" : ''}"
    end

end