Commit 566f4890 authored by Benjamin Neff's avatar Benjamin Neff

merge Federated::Shareable to Shareable

also drop xml-code for Shareable
parent 64503480
......@@ -3,7 +3,7 @@
# the COPYRIGHT file.
class Photo < ActiveRecord::Base
include Diaspora::Federated::Shareable
include Diaspora::Federated::Base
include Diaspora::Commentable
include Diaspora::Shareable
......@@ -81,13 +81,11 @@ class Photo < ActiveRecord::Base
end
end
def self.diaspora_initialize(params = {})
photo = shareable_initialize(params)
def self.diaspora_initialize(params={})
photo = new(params.to_hash.stringify_keys.slice(*column_names, "author"))
photo.random_string = SecureRandom.hex(10)
if photo.author.local?
photo.unprocessed_image.strip_exif = photo.author.owner.strip_exif
end
photo.unprocessed_image.strip_exif = photo.author.owner.strip_exif
if params[:user_file]
image_file = params.delete(:user_file)
......
......@@ -7,7 +7,7 @@ class Post < ActiveRecord::Base
include ApplicationHelper
include Diaspora::Federated::Shareable
include Diaspora::Federated::Base
include Diaspora::Likeable
include Diaspora::Commentable
......@@ -133,7 +133,7 @@ class Post < ActiveRecord::Base
#############
def self.diaspora_initialize(params)
shareable_initialize(params)
new(params.to_hash.stringify_keys.slice(*column_names, "author"))
end
def activity_streams?
......
# Copyright (c) 2012, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
# this module attempts to be what you need to mix into
# base level federation objects that are not relayable, and not persistable
# assumes there is an author, author_id, id,
module Diaspora
module Federated
module Shareable
def self.included(model)
model.instance_eval do
# we are order dependant so you don't have to be!
include Diaspora::Federated::Base
include Diaspora::Federated::Shareable::InstanceMethods
include Diaspora::Guid
xml_attr :diaspora_handle
xml_attr :public
xml_attr :created_at
end
end
module InstanceMethods
include Diaspora::Logging
def diaspora_handle
author.diaspora_handle
end
def diaspora_handle=(author_handle)
self.author = Person.where(diaspora_handle: author_handle).first
end
# The list of people that should receive this Shareable.
#
# @return [Array<Person>] The list of subscribers to this shareable
def subscribers
user = author.owner
if public?
user.contact_people
else
user.people_in_aspects(user.aspects_with_shareable(self.class, id))
end
end
end
end
end
end
......@@ -8,6 +8,8 @@ module Diaspora
module Shareable
def self.included(model)
model.instance_eval do
include Diaspora::Guid
has_many :aspect_visibilities, as: :shareable, validate: false, dependent: :delete_all
has_many :aspects, through: :aspect_visibilities
......@@ -15,6 +17,7 @@ module Diaspora
belongs_to :author, class_name: "Person"
delegate :diaspora_handle, to: :author
delegate :id, :name, :first_name, to: :author, prefix: true
# scopes
......@@ -29,45 +32,8 @@ module Diaspora
joins("LEFT OUTER JOIN aspect_visibilities ON aspect_visibilities.shareable_id = #{table_name}.id AND "\
" aspect_visibilities.shareable_type = '#{base_class}'")
}
def self.owned_or_visible_by_user(user)
with_visibility.where(
visible_by_user(user).or(arel_table[:public].eq(true)
.or(arel_table[:author_id].eq(user.person_id)))
).select("DISTINCT #{table_name}.*")
end
def self.from_person_visible_by_user(user, person)
return owned_by_user(user) if person == user.person
with_visibility.where(author_id: person.id).where(
visible_by_user(user).or(arel_table[:public].eq(true))
).select("DISTINCT #{table_name}.*")
end
def self.for_visible_shareable_sql(max_time, order, limit=15, types=Stream::Base::TYPES_OF_POST_IN_STREAM)
by_max_time(max_time, order).order(table_name + ".id DESC").where(type: types).limit(limit)
end
def self.by_max_time(max_time, order="created_at")
where("#{table_name}.#{order} < ?", max_time).order("#{table_name}.#{order} DESC")
end
def self.owned_by_user(user)
user.person.send(table_name).where(pending: false)
end
def self.shareable_initialize(params)
new(params.to_hash.stringify_keys.slice(*column_names)).tap do |new_shareable|
new_shareable.author = params[:author]
end
end
def self.visible_by_user(user)
ShareVisibility.arel_table[:user_id].eq(user.id)
end
private_class_method :visible_by_user
end
model.extend Diaspora::Shareable::QueryMethods
end
def receive(recipient_user_ids)
......@@ -80,5 +46,56 @@ module Diaspora
def update_reshares_counter
self.class.where(id: id).update_all(reshares_count: reshares.count)
end
def diaspora_handle=(author_handle)
self.author = Person.where(diaspora_handle: author_handle).first
end
# The list of people that should receive this Shareable.
#
# @return [Array<Person>] The list of subscribers to this shareable
def subscribers
user = author.owner
if public?
user.contact_people
else
user.people_in_aspects(user.aspects_with_shareable(self.class, id))
end
end
module QueryMethods
def owned_or_visible_by_user(user)
with_visibility.where(
visible_by_user(user).or(arel_table[:public].eq(true)
.or(arel_table[:author_id].eq(user.person_id)))
).select("DISTINCT #{table_name}.*")
end
def from_person_visible_by_user(user, person)
return owned_by_user(user) if person == user.person
with_visibility.where(author_id: person.id).where(
visible_by_user(user).or(arel_table[:public].eq(true))
).select("DISTINCT #{table_name}.*")
end
def for_visible_shareable_sql(max_time, order, limit=15, types=Stream::Base::TYPES_OF_POST_IN_STREAM)
by_max_time(max_time, order).order(table_name + ".id DESC").where(type: types).limit(limit)
end
def by_max_time(max_time, order="created_at")
where("#{table_name}.#{order} < ?", max_time).order("#{table_name}.#{order} DESC")
end
def owned_by_user(user)
user.person.public_send(table_name).where(pending: false)
end
private
def visible_by_user(user)
ShareVisibility.arel_table[:user_id].eq(user.id)
end
end
end
end
......@@ -187,6 +187,7 @@ describe Photo, :type => :model do
describe 'serialization' do
before do
skip # TODO
@saved_photo = with_carrierwave_processing do
@user.build_post(:photo, :user_file => File.open(@fixture_name), :to => @aspect.id)
end
......
......@@ -98,6 +98,10 @@ describe Reshare, type: :model do
let(:reshare) { build(:reshare) }
let(:xml) { reshare.to_xml.to_s }
before do
skip # TODO
end
context "serialization" do
it "serializes root_diaspora_id" do
expect(xml).to include("root_diaspora_id")
......
......@@ -265,6 +265,10 @@ describe StatusMessage, type: :model do
let(:xml) { message.to_xml.to_s }
let(:marshalled) { StatusMessage.from_xml(xml) }
before do
skip # TODO
end
it "serializes the escaped, unprocessed message" do
text = "[url](http://example.org)<script> alert('xss should be federated');</script>"
message.text = text
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment