diff --git a/app/builders/learning_object/draft_builder.rb b/app/builders/learning_object/draft_builder.rb index 3c4f318eb36ce0d09456d35e6f177809eaf912ad..a28c71efd9b0bbf1ef60ab251f4a2cd0eb949502 100644 --- a/app/builders/learning_object/draft_builder.rb +++ b/app/builders/learning_object/draft_builder.rb @@ -4,33 +4,30 @@ class LearningObject::DraftBuilder @draft = LearningObject.new(sanitize_params(params)) @draft.draft - - #build language @draft.language = Language.find(params[:language]) if params[:language].to_i > 0 # set publisher @draft.publisher = publisher - @draft.save + # build tags params[:tags].try(:each) do |t| tag = Tag.where(name: t['name']).first_or_create Tagging.where(tag: tag, taggable: @draft, tagger: publisher).first_or_create end @draft.save + @draft end - private - def self.sanitize_params(args={}) - _args = args.clone + params = args.clone %w(tags language link).each do |arg| - _args.delete(arg) + params.delete(arg) end - metadata = [{'key' => 'dc.object.url', 'value' => args[:link]}] - _args.merge(metadata: metadata) + metadata = { 'dc.object.url' => args[:link] } + params.merge(metadata: metadata) end end diff --git a/app/builders/learning_object_builder.rb b/app/builders/learning_object_builder.rb index 9a48e71cef22b149da4ab554a1366738a7f6fe9f..e1839a9c2f5d2195f5ef360647d276191bf5ecc9 100644 --- a/app/builders/learning_object_builder.rb +++ b/app/builders/learning_object_builder.rb @@ -1,14 +1,13 @@ class LearningObjectBuilder - def self.build_from_dspace(item) lo = LearningObject.new( - name: item.name, - id_dspace: item.id, - thumbnail: nil, - metadata: item.metadata.map(&:to_h) + name: item.name, + id_dspace: item.id, + thumbnail: nil, + metadata: dspace_metadata_to_hash(item.metadata) ) - institution = lo.get_metadata_values_of('dc.creator').first + institution = lo.get_metadata_value_of('dc.creator') institution = 'Desconhecido' if institution.blank? lo.publisher = Institution.where(name: institution).first_or_create @@ -49,9 +48,13 @@ class LearningObjectBuilder _params end - # private + def self.dspace_metadata_to_hash(metadata) + hash = Hash.new { |h, k| h[k] = Array.new(&h.default_proc) } + metadata.each { |m| hash[m.key] << m.value } + hash + end - #def self.sanitize_form_metadata(params={}) + # def self.sanitize_form_metadata(params={}) # if !params[:link].blank? # metadata = [{'key' => 'dc.object.url', 'value' => params[:link]}] # _args.merge(metadata: metadata) diff --git a/app/controllers/v1/learning_objects_controller.rb b/app/controllers/v1/learning_objects_controller.rb index ff124dc4c4a707fd52bd3876dbe0ca442732c81a..b7226c505bfa82001ac382151b8fd6ec04bf99f1 100644 --- a/app/controllers/v1/learning_objects_controller.rb +++ b/app/controllers/v1/learning_objects_controller.rb @@ -10,13 +10,14 @@ class V1::LearningObjectsController < ApplicationController before_action :authorize!, only: [:show, :update, :destroy] def index - render json: ActiveModel::ArraySerializer.new(LearningObject.limit(limit).offset(offset).all) + serializer = params[:obaa].nil? ? LearningObjectSerializer : LearningObjectObaaSerializer + render json: ActiveModel::ArraySerializer.new(LearningObject.limit(limit).offset(offset).all, each_serializer: serializer) end # GET /learning_objects/1 # GET /learning_objects/1.json def show - render json: @learning_object + render json: params[:obaa].nil? ? @learning_object : ActiveModel::LearningObjectObaaSerializer.new(@learning_object) end # POST /learning_objects diff --git a/app/models/concerns/metadatable.rb b/app/models/concerns/metadatable.rb index 07bd3ac398f424e522a0c2ab3a0f9b7b1a1b17a3..28ba9409496a851fb81de6a3edc39b1b77c60ecf 100644 --- a/app/models/concerns/metadatable.rb +++ b/app/models/concerns/metadatable.rb @@ -7,19 +7,11 @@ module Metadatable serialize :metadata, ArraySerializer end - def get_metadata_value_of key + def get_metadata_value_of(key) get_metadata_values_of(key).first end - def get_metadata_values_of key - values = [] - unless metadata.blank? - metadata.each do |m| - m = m.with_indifferent_access - values << m["value"] if m["key"] == key - end - end - values + def get_metadata_values_of(key) + metadata[key].blank? ? [] : metadata[key] end - end diff --git a/app/models/concerns/taggable.rb b/app/models/concerns/taggable.rb index aedd68087056700b9847f28715fedbb422146d50..bf62302ea155c014411a4d7467e819e39b6b12fa 100644 --- a/app/models/concerns/taggable.rb +++ b/app/models/concerns/taggable.rb @@ -5,6 +5,4 @@ module Taggable has_many :taggings, as: :taggable, dependent: :destroy has_many :tags, through: :taggings, dependent: :destroy end - - end diff --git a/app/serializers/learning_object_obaa_serializer.rb b/app/serializers/learning_object_obaa_serializer.rb new file mode 100644 index 0000000000000000000000000000000000000000..9558ff4a27ca44e1f9dd5f8f558e583b443dc312 --- /dev/null +++ b/app/serializers/learning_object_obaa_serializer.rb @@ -0,0 +1,64 @@ +class LearningObjectObaaSerializer < ActiveModel::Serializer +# "educational": { +# "description": "? não existe no PortalMecHomologa" +# }, +# "rights": { # nao existe no PortalMecHomologa +# "copyrightAndOhterRestrictions":"true", +# "cost": "false", +# "description": "nome da licença" +# }, + + def general + { + title: object.name, + description: object.description, + keywords: object.tags.map(&:name).join(','), + created_at: object.created_at, + updated_at: object.updated_at, + thumbnail: object.thumbnail.try(:url), + score: object.score, + likes_count: object.likes_count, + shares_count: object.shares_count, + acessibility: '' + } + end + + def identifier + { + catalog: 'PortalMec', + entry: object.id, + language: object.language.try(:code) + } + end + + def technical + { + location: object.default_attachment.try(:retrieve_url), + format: object.default_attachment.try(:mime_type) + } + end + + def metametadata + { + identifier: { + catalog: 'PortalMec', + name: object.publisher.try(:name), + entry_type: object.publisher.class.name, + entry: object.publisher.try(:id) + }, + contribute: { + role: 'Criador', + entity: object.author, + date: object.created_at + }, + metadataSchema: 'OBAAv1.0', + language: object.language.try(:name) + } + end + + # attributes :id , :name, :created_at, :updated_at, :description, :author, :score, :likes_count + attributes :id, :general, :identifier, :technical, :metametadata + + # has_many :tags + # has_many :attachments +end diff --git a/app/serializers/learning_object_serializer.rb b/app/serializers/learning_object_serializer.rb index 58e096c5623fb8a9d5f8bbc1215d858c45001077..f20e83db71d9f3957e88db3d25bd048781cc2411 100644 --- a/app/serializers/learning_object_serializer.rb +++ b/app/serializers/learning_object_serializer.rb @@ -1,5 +1,14 @@ class LearningObjectSerializer < ActiveModel::Serializer - attributes :id , :name, :created_at, :updated_at, :description, :author, :score, :likes_count + def default_location + object.default_attachment.try(:retrieve_url) + end + + def default_mime_type + object.default_attachment.try(:retrieve_url) + end + + attributes :id, :name, :description, :author, :thumbnail, :publisher, :language, :default_location, :default_mime_type, :score, :likes_count, :shares_count, :created_at, :updated_at + has_many :tags has_many :attachments end diff --git a/test/fixtures/learning_objects.yml b/test/fixtures/learning_objects.yml index 531fe909669c2a7c973b137617425bf559256dfe..1dec107ce313f68f7044532a0448021d84d1c475 100644 --- a/test/fixtures/learning_objects.yml +++ b/test/fixtures/learning_objects.yml @@ -61,7 +61,7 @@ lo_metadata: id_dspace: '2' object_type: image language: portuguese - metadata: '[{"key": "dc.creator", "value": "ufpr", "language": "nil"}]' + metadata: '{"dc.creator": "ufpr"}' lo_metadata2: name: 'Institution Object 2' @@ -70,7 +70,7 @@ lo_metadata2: id_dspace: '3' object_type: image language: portuguese - metadata: '[{"key": "dc.creator", "value": "ufpr", "language": "nil"}]' + metadata: '{"dc.creator": "ufpr"}' search: name: 'Teste'