# Markdown formatting support
gem "redcarpet"
+# For status transitions of Issues
+gem "aasm"
+
# Load libxml support for XML parsing and generation
gem "libxml-ruby", ">= 2.0.5", :require => "libxml"
remote: https://rubygems.org/
specs:
SystemTimer (1.2.3)
+ aasm (4.1.0)
actionmailer (4.2.7)
actionpack (= 4.2.7)
actionview (= 4.2.7)
DEPENDENCIES
SystemTimer (>= 1.1.3)
+ aasm
actionpack-page_caching
autoprefixer-rails
bigdecimal (~> 1.1.0)
--- /dev/null
+class Issue < ActiveRecord::Base
+ belongs_to :reportable, :polymorphic => true
+ has_many :reports
+ validates :reportable_id, :uniqueness => { :scope => [ :reportable_type ] }
+
+ # Check if more statuses are needed
+ enum status: %w( open ignored resolved )
+
+ scope :with_status, -> (issue_status) { where(:status => statuses[issue_status])}
+
+ def read_reports
+ resolved_at.present? ? reports.where("created_at < ?", resolved_at) : nil
+ end
+
+ def unread_reports
+ resolved_at.present? ? reports.where("created_at >= ?", resolved_at) : reports
+ end
+
+ include AASM
+ aasm :column => :status, :no_direct_assignment => true do
+ state :open, :initial => true
+ state :ignored
+ state :resolved
+
+ event :ignore do
+ transitions :from => :open, :to => :ignored
+ end
+
+ event :resolve do
+ transitions :from => :open, :to => :resolved
+ after do
+ self.resolved_at = Time.now.getutc
+ end
+ end
+
+ event :reopen do
+ transitions :from => :resolved, :to => :open
+ end
+
+ end
+
+end
--- /dev/null
+class Report < ActiveRecord::Base
+ belongs_to :issue
+ belongs_to :user
+
+end
--- /dev/null
+class CreateIssues < ActiveRecord::Migration
+ def change
+ create_table :issues do |t|
+ t.string :reportable_type
+ t.integer :reportable_id
+ t.integer :user_id
+ t.integer :status
+ t.datetime :resolved_at
+ t.integer :resolved_by
+ t.datetime :created_at
+ t.datetime :updated_at
+
+ t.timestamps null: false
+ end
+ end
+end
--- /dev/null
+class CreateReports < ActiveRecord::Migration
+ def change
+ create_table :reports do |t|
+ t.integer :issue_id
+ t.integer :user_id
+ t.text :details
+ t.datetime :created_at
+ t.datetime :updated_at
+
+ t.timestamps null: false
+ end
+ end
+end
ALTER SEQUENCE gpx_files_id_seq OWNED BY gpx_files.id;
+--
+-- Name: issues; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE issues (
+ id integer NOT NULL,
+ reportable_type character varying,
+ reportable_id integer,
+ user_id integer,
+ status integer,
+ resolved_at timestamp without time zone,
+ resolved_by integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+
+--
+-- Name: issues_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE issues_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: issues_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE issues_id_seq OWNED BY issues.id;
+
+
--
-- Name: languages; Type: TABLE; Schema: public; Owner: -
--
);
+--
+-- Name: reports; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE reports (
+ id integer NOT NULL,
+ issue_id integer,
+ user_id integer,
+ details text,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+
+--
+-- Name: reports_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE reports_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: reports_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE reports_id_seq OWNED BY reports.id;
+
+
--
-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -
--
ALTER TABLE ONLY gpx_files ALTER COLUMN id SET DEFAULT nextval('gpx_files_id_seq'::regclass);
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY issues ALTER COLUMN id SET DEFAULT nextval('issues_id_seq'::regclass);
+
+
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY redactions ALTER COLUMN id SET DEFAULT nextval('redactions_id_seq'::regclass);
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY reports ALTER COLUMN id SET DEFAULT nextval('reports_id_seq'::regclass);
+
+
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ADD CONSTRAINT gpx_files_pkey PRIMARY KEY (id);
+--
+-- Name: issues_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT issues_pkey PRIMARY KEY (id);
+
+
--
-- Name: languages_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ADD CONSTRAINT relations_pkey PRIMARY KEY (relation_id, version);
+--
+-- Name: reports_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY reports
+ ADD CONSTRAINT reports_pkey PRIMARY KEY (id);
+
+
--
-- Name: user_blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
INSERT INTO schema_migrations (version) VALUES ('20150222101847');
+INSERT INTO schema_migrations (version) VALUES ('20150516073616');
+
+INSERT INTO schema_migrations (version) VALUES ('20150516075620');
+
INSERT INTO schema_migrations (version) VALUES ('21');
INSERT INTO schema_migrations (version) VALUES ('22');
--- /dev/null
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ reportable_type: MyString
+ reportable_id: 1
+ user_id: 1
+ status: 1
+ resolved_at: 2015-05-16 13:06:16
+ resolved_by: 1
+ created_at: 2015-05-16 13:06:16
+ updated_at: 2015-05-16 13:06:16
+
+two:
+ reportable_type: MyString
+ reportable_id: 1
+ user_id: 1
+ status: 1
+ resolved_at: 2015-05-16 13:06:16
+ resolved_by: 1
+ created_at: 2015-05-16 13:06:16
+ updated_at: 2015-05-16 13:06:16
--- /dev/null
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ issue_id: 1
+ user_id: 1
+ details: MyText
+ created_at: 2015-05-16 13:26:20
+ updated_at: 2015-05-16 13:26:20
+
+two:
+ issue_id: 1
+ user_id: 1
+ details: MyText
+ created_at: 2015-05-16 13:26:20
+ updated_at: 2015-05-16 13:26:20
--- /dev/null
+require 'test_helper'
+
+class IssueTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
--- /dev/null
+require 'test_helper'
+
+class ReportTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end