Merge pull request #677 from metamaps/feature/node1-topic1-migration
node{1,2}_id => topic{1,2}_id migration and code changes
This commit is contained in:
commit
a8b698b11c
17 changed files with 57 additions and 52 deletions
|
@ -156,8 +156,8 @@ class MainController < ApplicationController
|
||||||
|
|
||||||
@synapses = @synapses.uniq(&:desc)
|
@synapses = @synapses.uniq(&:desc)
|
||||||
elsif topic1id && !topic1id.empty?
|
elsif topic1id && !topic1id.empty?
|
||||||
@one = policy_scope(Synapse).where('node1_id = ? AND node2_id = ?', topic1id, topic2id)
|
@one = policy_scope(Synapse).where('topic1_id = ? AND topic2_id = ?', topic1id, topic2id)
|
||||||
@two = policy_scope(Synapse).where('node2_id = ? AND node1_id = ?', topic1id, topic2id)
|
@two = policy_scope(Synapse).where('topic2_id = ? AND topic1_id = ?', topic1id, topic2id)
|
||||||
@synapses = @one + @two
|
@synapses = @one + @two
|
||||||
@synapses.sort! { |s1, s2| s1.desc <=> s2.desc }.to_a
|
@synapses.sort! { |s1, s2| s1.desc <=> s2.desc }.to_a
|
||||||
else
|
else
|
||||||
|
|
|
@ -63,6 +63,6 @@ class SynapsesController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def synapse_params
|
def synapse_params
|
||||||
params.require(:synapse).permit(:id, :desc, :category, :weight, :permission, :node1_id, :node2_id, :user_id)
|
params.require(:synapse).permit(:id, :desc, :category, :weight, :permission, :topic1_id, :topic2_id, :user_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -96,7 +96,7 @@ class TopicsController < ApplicationController
|
||||||
|
|
||||||
# find synapses between topics in alltopics array
|
# find synapses between topics in alltopics array
|
||||||
allsynapses = policy_scope(Synapse.for_topic(@topic.id)).to_a
|
allsynapses = policy_scope(Synapse.for_topic(@topic.id)).to_a
|
||||||
synapse_ids = (allsynapses.map(&:node1_id) + allsynapses.map(&:node2_id)).uniq
|
synapse_ids = (allsynapses.map(&:topic1_id) + allsynapses.map(&:topic2_id)).uniq
|
||||||
allsynapses.delete_if do |synapse|
|
allsynapses.delete_if do |synapse|
|
||||||
!synapse_ids.index(synapse.id).nil?
|
!synapse_ids.index(synapse.id).nil?
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@ class PermittedParams < Struct.new(:params)
|
||||||
end
|
end
|
||||||
|
|
||||||
def synapse_attributes
|
def synapse_attributes
|
||||||
[:desc, :category, :weight, :permission, :node1_id, :node2_id]
|
[:desc, :category, :weight, :permission, :topic1_id, :topic2_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
def topic_attributes
|
def topic_attributes
|
||||||
|
|
|
@ -3,8 +3,8 @@ class Synapse < ApplicationRecord
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
belongs_to :defer_to_map, class_name: 'Map', foreign_key: 'defer_to_map_id'
|
belongs_to :defer_to_map, class_name: 'Map', foreign_key: 'defer_to_map_id'
|
||||||
|
|
||||||
belongs_to :topic1, class_name: 'Topic', foreign_key: 'node1_id'
|
belongs_to :topic1, class_name: 'Topic', foreign_key: 'topic1_id'
|
||||||
belongs_to :topic2, class_name: 'Topic', foreign_key: 'node2_id'
|
belongs_to :topic2, class_name: 'Topic', foreign_key: 'topic2_id'
|
||||||
|
|
||||||
has_many :mappings, as: :mappable, dependent: :destroy
|
has_many :mappings, as: :mappable, dependent: :destroy
|
||||||
has_many :maps, through: :mappings
|
has_many :maps, through: :mappings
|
||||||
|
@ -12,14 +12,14 @@ class Synapse < ApplicationRecord
|
||||||
validates :desc, length: { minimum: 0, allow_nil: false }
|
validates :desc, length: { minimum: 0, allow_nil: false }
|
||||||
|
|
||||||
validates :permission, presence: true
|
validates :permission, presence: true
|
||||||
validates :node1_id, presence: true
|
validates :topic1_id, presence: true
|
||||||
validates :node2_id, presence: true
|
validates :topic2_id, presence: true
|
||||||
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
|
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
|
||||||
|
|
||||||
validates :category, inclusion: { in: ['from-to', 'both'], allow_nil: true }
|
validates :category, inclusion: { in: ['from-to', 'both'], allow_nil: true }
|
||||||
|
|
||||||
scope :for_topic, ->(topic_id = nil) {
|
scope :for_topic, ->(topic_id = nil) {
|
||||||
where('node1_id = ? OR node2_id = ?', topic_id, topic_id)
|
where(topic1_id: topic_id).or(where(topic2_id: topic_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
delegate :name, to: :user, prefix: true
|
delegate :name, to: :user, prefix: true
|
||||||
|
|
|
@ -5,8 +5,8 @@ class Topic < ApplicationRecord
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
belongs_to :defer_to_map, class_name: 'Map', foreign_key: 'defer_to_map_id'
|
belongs_to :defer_to_map, class_name: 'Map', foreign_key: 'defer_to_map_id'
|
||||||
|
|
||||||
has_many :synapses1, class_name: 'Synapse', foreign_key: 'node1_id', dependent: :destroy
|
has_many :synapses1, class_name: 'Synapse', foreign_key: 'topic1_id', dependent: :destroy
|
||||||
has_many :synapses2, class_name: 'Synapse', foreign_key: 'node2_id', dependent: :destroy
|
has_many :synapses2, class_name: 'Synapse', foreign_key: 'topic2_id', dependent: :destroy
|
||||||
has_many :topics1, through: :synapses2, source: :topic1
|
has_many :topics1, through: :synapses2, source: :topic1
|
||||||
has_many :topics2, through: :synapses1, source: :topic2
|
has_many :topics2, through: :synapses1, source: :topic2
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ class Topic < ApplicationRecord
|
||||||
scope :relatives, ->(topic_id = nil, user = nil) {
|
scope :relatives, ->(topic_id = nil, user = nil) {
|
||||||
# should only see topics through *visible* synapses
|
# should only see topics through *visible* synapses
|
||||||
# e.g. Topic A (commons) -> synapse (private) -> Topic B (commons) must be filtered out
|
# e.g. Topic A (commons) -> synapse (private) -> Topic B (commons) must be filtered out
|
||||||
synapses = Pundit.policy_scope(user, Synapse.where(node1_id: topic_id)).pluck(:node2_id)
|
synapses = Pundit.policy_scope(user, Synapse.where(topic1_id: topic_id)).pluck(:topic2_id)
|
||||||
synapses += Pundit.policy_scope(user, Synapse.where(node2_id: topic_id)).pluck(:node1_id)
|
synapses += Pundit.policy_scope(user, Synapse.where(topic2_id: topic_id)).pluck(:topic1_id)
|
||||||
where(id: synapses.uniq)
|
where(id: synapses.uniq)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,18 +94,18 @@ class Topic < ApplicationRecord
|
||||||
output = []
|
output = []
|
||||||
synapses.each do |synapse|
|
synapses.each do |synapse|
|
||||||
if synapse.category == 'from-to'
|
if synapse.category == 'from-to'
|
||||||
if synapse.node1_id == id
|
if synapse.topic1_id == id
|
||||||
output << synapse.node1_id.to_s + '->' + synapse.node2_id.to_s
|
output << synapse.topic1_id.to_s + '->' + synapse.topic2_id.to_s
|
||||||
elsif synapse.node2_id == id
|
elsif synapse.topic2_id == id
|
||||||
output << synapse.node2_id.to_s + '<-' + synapse.node1_id.to_s
|
output << synapse.topic2_id.to_s + '<-' + synapse.topic1_id.to_s
|
||||||
else
|
else
|
||||||
raise 'invalid synapse on topic in synapse_csv'
|
raise 'invalid synapse on topic in synapse_csv'
|
||||||
end
|
end
|
||||||
elsif synapse.category == 'both'
|
elsif synapse.category == 'both'
|
||||||
if synapse.node1_id == id
|
if synapse.topic1_id == id
|
||||||
output << synapse.node1_id.to_s + '<->' + synapse.node2_id.to_s
|
output << synapse.topic1_id.to_s + '<->' + synapse.topic2_id.to_s
|
||||||
elsif synapse.node2_id == id
|
elsif synapse.topic2_id == id
|
||||||
output << synapse.node2_id.to_s + '<->' + synapse.node1_id.to_s
|
output << synapse.topic2_id.to_s + '<->' + synapse.topic1_id.to_s
|
||||||
else
|
else
|
||||||
raise 'invalid synapse on topic in synapse_csv'
|
raise 'invalid synapse on topic in synapse_csv'
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,8 +14,7 @@ module Api
|
||||||
end
|
end
|
||||||
|
|
||||||
# self.embeddable might look like this:
|
# self.embeddable might look like this:
|
||||||
# topic1: { attr: :node1, serializer: TopicSerializer }
|
# creator: { attr: :first_creator, serializer: UserSerializer }
|
||||||
# topic2: { attr: :node2, serializer: TopicSerializer }
|
|
||||||
# contributors: { serializer: UserSerializer}
|
# contributors: { serializer: UserSerializer}
|
||||||
# This method will remove the :attr key if the underlying attribute name
|
# This method will remove the :attr key if the underlying attribute name
|
||||||
# is different than the name provided in the final json output. All other keys
|
# is different than the name provided in the final json output. All other keys
|
||||||
|
@ -24,9 +23,9 @@ module Api
|
||||||
#
|
#
|
||||||
# This setup means if you passed this self.embeddable config and sent no
|
# This setup means if you passed this self.embeddable config and sent no
|
||||||
# ?embed= query param with your API request, you would get the regular attributes
|
# ?embed= query param with your API request, you would get the regular attributes
|
||||||
# plus topic1_id, topic2_id, and contributor_ids. If you pass
|
# plus creator_id and contributor_ids. If you passed ?embed=creator,contributors
|
||||||
# ?embed=topic1,topic2,contributors, then instead of two ids and an array of ids,
|
# then instead of an id and an array of ids, you would get a serialized user
|
||||||
# you would get two serialized topics and an array of serialized users
|
# (the first_creator) and an array of serialized users (the contributors).
|
||||||
def self.embed_dat
|
def self.embed_dat
|
||||||
embeddable.each_pair do |key, opts|
|
embeddable.each_pair do |key, opts|
|
||||||
attr = opts.delete(:attr) || key
|
attr = opts.delete(:attr) || key
|
||||||
|
|
|
@ -11,8 +11,8 @@ module Api
|
||||||
|
|
||||||
def self.embeddable
|
def self.embeddable
|
||||||
{
|
{
|
||||||
topic1: { attr: :node1, serializer: TopicSerializer },
|
topic1: { serializer: TopicSerializer },
|
||||||
topic2: { attr: :node2, serializer: TopicSerializer },
|
topic2: { serializer: TopicSerializer },
|
||||||
user: {}
|
user: {}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -58,8 +58,8 @@ class MapExportService
|
||||||
visible_synapses.map do |synapse|
|
visible_synapses.map do |synapse|
|
||||||
next nil if synapse.nil?
|
next nil if synapse.nil?
|
||||||
OpenStruct.new(
|
OpenStruct.new(
|
||||||
topic1: synapse.node1_id,
|
topic1: synapse.topic1_id,
|
||||||
topic2: synapse.node2_id,
|
topic2: synapse.topic2_id,
|
||||||
category: synapse.category,
|
category: synapse.category,
|
||||||
description: synapse.desc,
|
description: synapse.desc,
|
||||||
user: synapse.user.name,
|
user: synapse.user.name,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
class RenameNode1IdToTopic1IdInSynapses < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
rename_column :synapses, :node1_id, :topic1_id
|
||||||
|
rename_column :synapses, :node2_id, :topic2_id
|
||||||
|
end
|
||||||
|
end
|
14
db/schema.rb
14
db/schema.rb
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20160820231717) do
|
ActiveRecord::Schema.define(version: 20160928022635) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -175,16 +175,16 @@ ActiveRecord::Schema.define(version: 20160820231717) do
|
||||||
t.text "category"
|
t.text "category"
|
||||||
t.text "weight"
|
t.text "weight"
|
||||||
t.text "permission"
|
t.text "permission"
|
||||||
t.integer "node1_id"
|
t.integer "topic1_id"
|
||||||
t.integer "node2_id"
|
t.integer "topic2_id"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
t.integer "defer_to_map_id"
|
t.integer "defer_to_map_id"
|
||||||
t.index ["node1_id", "node1_id"], name: "index_synapses_on_node1_id_and_node1_id", using: :btree
|
t.index ["topic1_id", "topic1_id"], name: "index_synapses_on_node1_id_and_node1_id", using: :btree
|
||||||
t.index ["node1_id"], name: "index_synapses_on_node1_id", using: :btree
|
t.index ["topic1_id"], name: "index_synapses_on_topic1_id", using: :btree
|
||||||
t.index ["node2_id", "node2_id"], name: "index_synapses_on_node2_id_and_node2_id", using: :btree
|
t.index ["topic2_id", "topic2_id"], name: "index_synapses_on_node2_id_and_node2_id", using: :btree
|
||||||
t.index ["node2_id"], name: "index_synapses_on_node2_id", using: :btree
|
t.index ["topic2_id"], name: "index_synapses_on_topic2_id", using: :btree
|
||||||
t.index ["user_id"], name: "index_synapses_on_user_id", using: :btree
|
t.index ["user_id"], name: "index_synapses_on_user_id", using: :btree
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -531,10 +531,10 @@ _Backbone.init = function () {
|
||||||
else return false
|
else return false
|
||||||
},
|
},
|
||||||
getTopic1: function () {
|
getTopic1: function () {
|
||||||
return Metamaps.Topics.get(this.get('node1_id'))
|
return Metamaps.Topics.get(this.get('topic1_id'))
|
||||||
},
|
},
|
||||||
getTopic2: function () {
|
getTopic2: function () {
|
||||||
return Metamaps.Topics.get(this.get('node2_id'))
|
return Metamaps.Topics.get(this.get('topic2_id'))
|
||||||
},
|
},
|
||||||
getDirection: function () {
|
getDirection: function () {
|
||||||
var t1 = this.getTopic1(),
|
var t1 = this.getTopic1(),
|
||||||
|
@ -559,8 +559,8 @@ _Backbone.init = function () {
|
||||||
var synapseID = this.isNew() ? this.cid : this.id
|
var synapseID = this.isNew() ? this.cid : this.id
|
||||||
|
|
||||||
var edge = {
|
var edge = {
|
||||||
nodeFrom: this.get('node1_id'),
|
nodeFrom: this.get('topic1_id'),
|
||||||
nodeTo: this.get('node2_id'),
|
nodeTo: this.get('topic2_id'),
|
||||||
data: {
|
data: {
|
||||||
$synapses: [],
|
$synapses: [],
|
||||||
$synapseIDs: [synapseID],
|
$synapseIDs: [synapseID],
|
||||||
|
|
|
@ -333,8 +333,8 @@ const Import = {
|
||||||
desc: desc || "",
|
desc: desc || "",
|
||||||
category: category,
|
category: category,
|
||||||
permission: permission,
|
permission: permission,
|
||||||
node1_id: topic1.id,
|
topic1_id: topic1.id,
|
||||||
node2_id: topic2.id
|
topic2_id: topic2.id
|
||||||
})
|
})
|
||||||
Metamaps.Synapses.add(synapse)
|
Metamaps.Synapses.add(synapse)
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ const JIT = {
|
||||||
synapses.each(function (s) {
|
synapses.each(function (s) {
|
||||||
edge = s.createEdge()
|
edge = s.createEdge()
|
||||||
|
|
||||||
if (topics.get(s.get('node1_id')) === undefined || topics.get(s.get('node2_id')) === undefined) {
|
if (topics.get(s.get('topic1_id')) === undefined || topics.get(s.get('topic2_id')) === undefined) {
|
||||||
// this means it's an invalid synapse
|
// this means it's an invalid synapse
|
||||||
synapsesToRemove.push(s)
|
synapsesToRemove.push(s)
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,8 +200,8 @@ const Map = {
|
||||||
var descNotFiltered = Filter.visible.synapses.indexOf(desc) > -1
|
var descNotFiltered = Filter.visible.synapses.indexOf(desc) > -1
|
||||||
// make sure that both topics are being added, otherwise, it
|
// make sure that both topics are being added, otherwise, it
|
||||||
// doesn't make sense to add the synapse
|
// doesn't make sense to add the synapse
|
||||||
var topicsNotFiltered = nodes_array.indexOf(synapse.get('node1_id')) > -1
|
var topicsNotFiltered = nodes_array.indexOf(synapse.get('topic1_id')) > -1
|
||||||
topicsNotFiltered = topicsNotFiltered && nodes_array.indexOf(synapse.get('node2_id')) > -1
|
topicsNotFiltered = topicsNotFiltered && nodes_array.indexOf(synapse.get('topic2_id')) > -1
|
||||||
if (descNotFiltered && topicsNotFiltered) {
|
if (descNotFiltered && topicsNotFiltered) {
|
||||||
synapses_array.push(synapse.id)
|
synapses_array.push(synapse.id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,8 +128,8 @@ const Synapse = {
|
||||||
topic1 = node1.getData('topic')
|
topic1 = node1.getData('topic')
|
||||||
synapse = new Metamaps.Backbone.Synapse({
|
synapse = new Metamaps.Backbone.Synapse({
|
||||||
desc: Create.newSynapse.description,
|
desc: Create.newSynapse.description,
|
||||||
node1_id: topic1.isNew() ? topic1.cid : topic1.id,
|
topic1_id: topic1.isNew() ? topic1.cid : topic1.id,
|
||||||
node2_id: topic2.isNew() ? topic2.cid : topic2.id,
|
topic2_id: topic2.isNew() ? topic2.cid : topic2.id,
|
||||||
})
|
})
|
||||||
Metamaps.Synapses.add(synapse)
|
Metamaps.Synapses.add(synapse)
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ const SynapseCard = {
|
||||||
|
|
||||||
var directionCat = synapse.get('category'); // both, none, from-to
|
var directionCat = synapse.get('category'); // both, none, from-to
|
||||||
if (directionCat == 'from-to') {
|
if (directionCat == 'from-to') {
|
||||||
var from_to = [synapse.get('node1_id'), synapse.get('node2_id')]
|
var from_to = [synapse.get('topic1_id'), synapse.get('topic2_id')]
|
||||||
if (from_to[0] == left.id) {
|
if (from_to[0] == left.id) {
|
||||||
// check left checkbox
|
// check left checkbox
|
||||||
$('#edit_synapse_left').addClass('checked')
|
$('#edit_synapse_left').addClass('checked')
|
||||||
|
@ -273,8 +273,8 @@ const SynapseCard = {
|
||||||
|
|
||||||
synapse.save({
|
synapse.save({
|
||||||
category: dirCat,
|
category: dirCat,
|
||||||
node1_id: dir[0],
|
topic1_id: dir[0],
|
||||||
node2_id: dir[1]
|
topic2_id: dir[1]
|
||||||
})
|
})
|
||||||
Visualize.mGraph.plot()
|
Visualize.mGraph.plot()
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue