Skip to content
Snippets Groups Projects
cozy_file.rb 4.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • # File is already taken by the stdlib
    class CozyFile
    
      include Model::Files
    
    Gara64's avatar
    Gara64 committed
      attr_reader :name, :dir_id, :mime, :trashed, :md5sum, :referenced_by,
    
                  :metadata, :size, :executable, :file_class, :cozy_metadata,
                  :old_versions
    
    Gara64's avatar
    Gara64 committed
    
    
      def self.parse_jsonapi(body)
        j = JSON.parse(body)["data"]
    
    Gara64's avatar
    Gara64 committed
        id = j["id"]
    
        rev = j.dig "meta", "rev"
    
        old_versions = j.dig "relationships", "old_versions", "data"
    
    Gara64's avatar
    Gara64 committed
        referenced_by = j.dig "relationships", "referenced_by", "data"
    
    Gara64's avatar
    Gara64 committed
        j = j["attributes"]
    
    Gara64's avatar
    Gara64 committed
        f = CozyFile.new(
          name: j["name"],
          dir_id: j["dir_id"],
          trashed: j["trashed"],
    
    Gara64's avatar
    Gara64 committed
          md5sum: j["md5sum"],
    
    Gara64's avatar
    Gara64 committed
          size: j["size"],
          executable: j["executable"],
    
          mime: j["mime"],
    
    Gara64's avatar
    Gara64 committed
          file_class: j["class"],
          metadata: j["metadata"],
    
          cozy_metadata: j["cozyMetadata"],
    
          old_versions: old_versions,
    
    Gara64's avatar
    Gara64 committed
          referenced_by: referenced_by
    
    Gara64's avatar
    Gara64 committed
        )
    
    Gara64's avatar
    Gara64 committed
        f.couch_id = id
        f.couch_rev = rev
        f
      end
    
    
      def self.load_from_url(inst, path)
        opts = {
          accept: "application/vnd.api+json",
          authorization: "Bearer #{inst.token_for doctype}"
        }
        res = inst.client[path].get opts
        parse_jsonapi res.body
      end
    
    
    Gara64's avatar
    Gara64 committed
      def restore_from_trash(inst)
        opts = {
          authorization: "Bearer #{inst.token_for doctype}"
        }
        res = inst.client["/files/trash/#{@couch_id}"].post nil, opts
        j = JSON.parse(res.body)["data"]
        @trashed = false
        @dir_id = j.dig "attributes", "dir_id"
      end
    
    
      def self.options_from_fixture(filename, opts = {})
        opts = opts.dup
    
        opts[:content] = File.read filename
        opts[:name] ||= "#{Faker::Internet.slug}#{File.extname(filename)}"
    
        opts[:mime] ||= MiniMime.lookup_by_filename(filename).content_type
    
      def self.metadata_options_for(inst, meta)
        opts = {
          authorization: "Bearer #{inst.token_for doctype}",
          :"content-type" => "application/vnd.api+json"
        }
        body = JSON.generate data: { type: "io.cozy.files.metadata", attributes: meta }
        res = inst.client["/files/upload/metadata"].post body, opts
        id = JSON.parse(res.body)["data"]["id"]
        { metadata_id: id }
      end
    
    
      def initialize(opts = {})
        @name = opts[:name] || Faker::Internet.slug
    
    Gara64's avatar
    Gara64 committed
        @dir_id = opts[:dir_id] || Folder::ROOT_DIR
    
        @mime = opts[:mime] || "text/plain"
    
    Gara64's avatar
    Gara64 committed
        @content = opts[:content] || Faker::Friends.quote
    
    Gara64's avatar
    Gara64 committed
        @trashed = opts[:trashed]
        @md5sum = opts[:md5sum]
    
    Gara64's avatar
    Gara64 committed
        @metadata = opts[:metadata]
        @size = opts[:size]
        @executable = opts[:executable]
        @file_class = opts[:file_class]
    
        @cozy_metadata = opts[:cozy_metadata]
    
    Gara64's avatar
    Gara64 committed
        @referenced_by = opts[:referenced_by]
    
        @old_versions = opts[:old_versions] || []
    
      end
    
      def save(inst)
        opts = {
          accept: "application/vnd.api+json",
          authorization: "Bearer #{inst.token_for doctype}",
          :"content-type" => mime
        }
        res = inst.client["/files/#{dir_id}?Type=file&Name=#{name}"].post @content, opts
        j = JSON.parse(res.body)["data"]
        @couch_id = j["id"]
    
        @couch_rev = j["meta"]["rev"]
    
        @cozy_metadata = j["attributes"]["cozyMetadata"]
    
    Gara64's avatar
    Gara64 committed
      def overwrite(inst, opts = {})
    
        @mime = opts[:mime] || @mime
    
    Gara64's avatar
    Gara64 committed
        @content = opts[:content] || Faker::Friends.quote
    
          accept: "application/vnd.api+json",
          authorization: "Bearer #{inst.token_for doctype}",
          :"content-type" => mime
        }
    
        u = "/files/#{@couch_id}"
        u = "#{u}?MetadataID=#{opts[:metadata_id]}" if opts[:metadata_id]
        res = inst.client[u].put @content, headers
    
        j = JSON.parse(res.body)["data"]
        @couch_rev = j["meta"]["rev"]
    
    Gara64's avatar
    Gara64 committed
        @md5sum = j["attributes"]["md5sum"]
    
    
      PHOTOS = %w(about apps architecture business community faq features try).freeze
    
      def self.create_photos(inst, opts = {})
        dir = File.expand_path "../.photos", Helpers.current_dir
        PHOTOS.map do |photo|
    
          create inst, options_from_fixture("#{dir}/#{photo}.jpg", opts)
    
        end
      end
    
      def self.ensure_photos_in_cache
        dir = File.expand_path "../.photos", Helpers.current_dir
        return if Dir.exist? dir
        FileUtils.mkdir_p dir
        PHOTOS.each do |photo|
          url = "https://cozy.io/fr/images/bkg-#{photo}.jpg"
          `wget -q #{url} -O #{dir}/#{photo}.jpg`
        end
      end