* Upgrade Rails to 6.1
* Switch to unreleased bullet
* Run rails app:update
* Add deprecation notices after reading changelogs
* Fix app:update error
* Move middleware in the correct place
* Temporarily disable ransack which does not support Rails 6.1
* Remove wrongly merged file
* Re-run spring binstub
* Fix double quotes
* Track ransack branch with Rails 6.1 support
* Fix deprecation
* Switch to Ransack 2.4 which supports Rails 6.1 rc1
* Fix missing default params for the duration substitution
* Fix new behavior of relation.pluck with contradictory queries
* Fix uploaders specs by tracking rspec-rails main repo
* Disable bullet temporarily
* Fix remaining fixture_file_upload usages
* Add default seconds for video article duration
* Trigger Travis CI
* Upgrade Rails to 6.1.0.rc2
* Remove file deleted on master
* Add Rails 6.1 gem to Gemfile
* Trigger Travis CI
* Revert "Disable bullet temporarily"
This reverts commit cee0c2ce61fb72cbc16d52c94b12ee681e873031.
* Fix bullet version
* Upgrade to acts-as-taggable 7 and fix conflict
* Update Gemfile and rspec-* gems
* Fix nokogiri in Gemfile.lock
* Switch to rspec-rails main branch
* Remove leftover vendored cached items
* Fix path for Rails 6.1
* Use latest release of erb_lint
* Re-run rails app:update to incorporate new changes
* Disable erb_lint's ErbSafety checks
* Fix Gemfile.lock and re-add platform specific gems of Nokogiri
* Add mini_portile2 as well
* Fix latest merge conflict by removing now unused faraday_middleware
* Upgrade to Rails 6.1.3.1
* Regenerate Gemfile.lock and vendor/cache
* Add x86_64 linux gem
* Mark spec as flaky
* Revert "Mark spec as flaky"
This reverts commit 3caba94b33645f9b59c84ba78ee8df042fc7aee0.
Co-authored-by: Mac Siri <krairit.siri@gmail.com>
* Remove pro role on user, expose pro dashboard to all users as analytics
* Remove pro from Elasticsearch mappings
* Update user role docs to use :trusted over :pro
* Remove pro from Role model spec
* Remove more references to pro, as noted by @rhymes
* Added credits_awarded to /admin/badges forms
* Award credits only if badge has them
* Removed information about credits and listings in the new badge email when not needed
* Specs for number of credits awarded for badges
* Added missing newline
* Fix typo
Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com>
* Improve new_badge_email.text.erb
Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com>
* Fixed number of credits in notification
* Added specs for number of credits in notifications
Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com>
* Add PgSearch to Listing model
* Working MVP - pre-optimizations
* Remove includes
* Update search_spec
* Add more specs
* Fix specs
* Refactor filter_by_category
* Update block parameter name
* Add published index to classified_listings table
* Preload user, organization, and listing_category
* Working MVP - pre-optimizations
* Refactor filter_by_category
* Update schema
* Fix schema for real
* Remove constant specs and make them private
* Instrument EmailDigestArticleCollector
On DEV, since we skip this with sidekiq-cron and instead process them
inline using Heroku Scheduler (which is not instrumented), we miss out
on all instrumentation for this process and have no idea how long it
takes to process each user.
With this instrumentation in place, we can see how long it takes to
process each user and aggregate them to see how long it takes to process
all users.
This commit also adds an Instrumentation mixin that we can use to
instrument blocks easily:
instrument "MyClass.my_method", tags: { article: article.id } do |span|
# ...
end
* Add Instrumentation mixin
Oops, completely forgot to commit this file
* Step one in populating the reading list with PG
This first attempt tries to recycle the `Search::ArticleSerializer` which is only
used in input in ES, but we're using it in output in PG.
For this reason it's currently 15.55x times slower
* Serialize only what is requested by the frontend
`Search::ArticleSerializer` which is only used in ES in the indexing step aims
to add as much info as possible for broader purposes, in this case
(with serialization in output) we should aim to save only what's requested from
the frontend.
* Optimize selection of articles columns
* Select only needed columns for users
* Compute total of reading list items
* Attach the basic filtering based on PG on the search controller
* Restructure in methods
* Add tags support
* Use LIKE on articles.cached_tag_list
* Fix tags as nil
* Fix default pagination
* Add optional FTS for reading list
* Reworded the tags comment explaining why
* Add index to reactions.status
* Fix total counter in Preact readingList component
* Fix total count in reading list backend search
* Add GIN index to articles.cached_tag_list
* Add service tests
* Add search request specs
* Added missing early return
* Update spec/requests/search_spec.rb
Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com>
* Extract MAX_PER_PAGE constant and add comments
Co-authored-by: Julianna Tetreault <32834804+juliannatetreault@users.noreply.github.com>
* Make definition of new user configurable
* Add new user configuration to config admin
* Only decorate on-demand
* Adapt new user logic
* Update app/lib/constants/site_config.rb
Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com>
Co-authored-by: Vaidehi Joshi <vaidehi.sj@gmail.com>
* Changes PushNotifications::Send to use user_ids
* Changes devices#destroy to use unauthenticated_params
* Fix failing spec - new logic reverses order
* Apply suggestions from code review
Co-authored-by: Jamie Gaskins <jgaskins@gmail.com>
* Only send new_comment PN with Rpush behind FeatureFlag + spec tweak
* Add query order explicitly to avoid flakyness
* Review feedback - remove order clause in query & other tweaks
Co-authored-by: Jamie Gaskins <jgaskins@gmail.com>
* Add PostgreSQL FTS for usernames
* Change profile_image_90 logic
* Make search_users private
* Add tsvector index on usernames
* Limit the number of search results
* Update index name
* Update worker calculation and disable early return
* Enable service tests
This updates the test to look at the individual article scores
changing, rather than the sum of the articles scores changing
The scores lambda was added as a way to observe this eagerly
* Correctly handle raising the score when vomit is cleared
The initial implementation loaded the articles reactions and the
user's reactions in order to rescore. This restores that activity.
It occurs to me that article.reactions.sum(:points) +
user.reactions.sum(:points) feels like something articles should know
how to do, in which case we can move this into article (#rescore!)?
and call that instead of knowing how to handle moderation specially here.
* Move logic to Article#update_score
Having realized "sum of reaction scores" was an Article concern, I
found that we have a worker to score articles that does _exactly_ what
we're doing here.
Let's use that and allow the vomit reaction presence or absence on a
user to automatically affect the article calculations.
This is at least n + 1 and maybe worse.
* Add Search::Postgres::Tag to retrieve tags for autocompletion
* Add Search::Postgres::Tag in SearchController behind a feature flag
* Update spec/services/search/postgres/tag_spec.rb
Co-authored-by: Michael Kohl <citizen428@dev.to>
* Add index to tags.supported
* Fix hotness_score ordering
Co-authored-by: Michael Kohl <citizen428@dev.to>
* Limit number of mentions in a single comment
Ensure that no more than 6 users can be mentioned in a single comment
* Extract max user mentions into constant
* Check mentions but don't process them unnecessarily
* Add error message check to comment spec
* Add MAX_USER_MENTION_LIVE_AT to comments, plus specs
* Bump MAX_USER_MENTIONS to 7 for DEV Top Seven posts
* Add some clarifying comments around MAX_USER_MENTION limit
* Update app/models/comment.rb to use activesupport helper!
Co-authored-by: Michael Kohl <citizen428@dev.to>
* Start refactoring articles update
* Articles update refactoring
* Added a couple of tests for Articles::Updater
* Reorganized code in Articles::Updater and ::Attributes a bit
* A couple of more tests for Articles::Attributes
* Reverted changed in the articles_controller
* Edited_at in Articles::Attributes
* Use Articles::Updater in ArticlesController
* Tests for notifications when published/unpublished an article
* Removed old code
* Return result object from Articles::Updater
* Don't reset articles collection when no series was passed
* Fixed sending notifications when published an article the first time
* Fix articles collection when updating
* Fix setting attributes for articles update
* Spec for articles update via api failure
* More tests for Articles::Updater
* More specs for articles updating
* Pass article instead of article_id to articles updater to avoid loading an article twice
* Remove the redundant check in the articles_controller
* Articles::Attributes refactoring
* Create a new method that replaces <code> tags to
triple back ticks (```)
* Create unit tests for add_proper_code_tags method
* Rubocop fixes
* Change method name to one that is more descriptive/accurate
Fix method to allow for triple backticks, sameline code tags and multiline codetags in the same post/article
Fix test to match with method name change
* Fix rubocop offenses
* Fix Rubocop offenses
* Add additional assertions to make sure backticks are present
* WIP: Adds a Users::RemoveRole service to encapsulate Admin::UsersController#destroy
* Adds #role_display_name helper to application_helper.rb for extensibility
* Adjusts Member is Suspended banner to Member is Banned for consistency
* WIP: Extract Admin::UsersController#destroy into remove_role.rb service
* Cleans up Admin::UsersController#destroy and remove_role.rb service
- Removes unneccessary code from Admin::UsersController#destroy
- Replaces args with keyword args in Admin::UsersController#destroy
- Replaces args with keyword args in remove_role.rb service
- Refactors code to be more extensible and cleaner overall
* Adds a remove_role_spec.rb to test Users::RemoveRole service
* Fix typo in Admin::UsersController#destroy
* Refactors role_display_name helper method and reverts change to banner
* Use #role_display_name in _current_roles.html.erb
* Refactors conditional, names, and adjusts spec to account for refactors
* Raises StandardError if there is an issue with role removal
* Prevent banned users from accessing API
* Prevent banned users from creating API keys
* Delete API keys when deleting user
* Add tests
* Prevent banned signed in users from accessing API oops
* Refactor authenticate! for readability
* chore: use consistent code styles for the parenthesis around arguments
* Revert "chore: use consistent code styles for the parenthesis around arguments"
This reverts commit 281c899a5cff0480b182fef45b10ef69979166cb.
* chore: add consistent parenthesis
* Add new table and model
* Store banned user username hash on delete
* Prevent previously banned user from signing up again
* Update method name
* Refactor code and add more specs
* Test improvements
* Don't override existing global flash
* Fix typo
* Update spec description
* Update schema.rb
* More schema.rb fixes
* Simplify spec
* Update migration
* Clean up migration
* Rename method
* Add DataDog counter
* Revisit error handling
* Remove spurious empty line
* Make model name more explicit
* feat: add a feature flag for data update scripts
* feat: write some tests for it
* chore: oops
* stub the data update scripts out wherever the profile admin is
* chore: remove some unneeded ones
* refactor: use call_original
* feat: add a feature flag to all the Forems (but not enable it as yet)
* feat: add tech_menu_items to the admin helper
* feat: add the tech resources to /admin if the user has the correct role
* feat: use a partial that will show the data update scripts in the navbar with the correct role
* chore: use a method
* test: chore
* feat: setup the data to need permission single_resource_admin with DataUpdateScript permissions
* chore: remove the if current_user.tech_admin?
* chore: remove line
* feat: add a DUS for single_resource_admin roles to be added to users with tech_admin roles
* fix: move all teh routes outside of the block where tech_admin is required.
* chore: use the constant and remove the method
* chore: add a comma
* Update config/routes.rb
Co-authored-by: rhymes <rhymes@hey.com>
* feat: add a tech admin role to the dropdown
* feat: add the tech admin role along with single_resource_admin
* chore: oops
* refactor: amend the spec to use let blocks
Co-authored-by: rhymes <rhymes@hey.com>
* Declare winner in feed_top_articles_query test
* Some WIP modifications to lfe
* Fix up tests and generalize
* Fix style
* Adjust tests to handle different field test scenarios
* Remove socre_randomness tests
* Fix test to fit stub
* Update app/workers/users/record_field_test_event_worker.rb
* This change abstracts the DatadogStatsClient into a ForemStatsClient.
The purpose of this abstraction is to set the foundation for a subsequent PR that will allow one to use New Relic for recording Forem stats, instead of Datadog, if there is a New Relic configuration found.
This specific change creates an abstraction layer that can be built upon, without changing any actual default behavior. All specs still pass.
* Use delegate instead of explicit methods.
* Delegate instead of explicit methods.
* Fix the error.
* Refactor according to the suggestions in the comments.
* Ooops. Stats work better when all of the code is committed.
* Removing the alias of count to increment since that was done in error.
When `acts-as-taggable-on`'s `.tagged_with()` is used with `any: true`,
the gem will use `SELECT *` regardless of any previous (or following) requests
of selecting a limited amount of columns.
Given that the `articles` table has [73 columns](https://dev.to/admin/blazer/queries/314-number-of-columns-in-all-tables)
that will amount to wasted RAM memory for columns we don't need.
By "unscoping" any previous `select()` we can optimize used memory.
Before:
```ruby
[24] pry(main)> Article.tagged_with([:ruby], any: true).select(:id, :name).to_sql
=> "SELECT \"articles\".*, \"articles\".\"id\", \"name\" FROM \"articles\" WHERE EXISTS (SELECT * FROM \"taggings\" WHERE \"taggings\".\"taggable_id\" = \"articles\".\"id\" AND \"taggings\".\"taggable_type\" = 'Article' AND \"taggings\".\"tag_id\" IN (SELECT \"tags\".\"id\" FROM \"tags\" WHERE (\"tags\".\"name\" LIKE 'ruby' ESCAPE '!')))"
```
Note, how the SQL query is `articles.*, articles.column_a`
After:
[25] pry(main)> Article.tagged_with([:ruby], any: true).unscope(:select).select(:id, :name).to_sql
=> "SELECT \"articles\".\"id\", \"name\" FROM \"articles\" WHERE EXISTS (SELECT * FROM \"taggings\" WHERE \"taggings\".\"taggable_id\" = \"articles\".\"id\" AND \"taggings\".\"taggable_type\" = 'Article' AND \"taggings\".\"tag_id\" IN (SELECT \"tags\".\"id\" FROM \"tags\" WHERE (\"tags\".\"name\" LIKE 'ruby' ESCAPE '!')))"
```
`articles.*` is gone :-)
- https://github.com/mbleigh/acts-as-taggable-on/issues/936
- 47da5036de/lib/acts_as_taggable_on/taggable/tagged_with_query/any_tags_query.rb (L2-L8)
* Use proper Mailchimp newsletter IDs respective to methods
* Add guard clauses when Mailchimp newsletter isn't enabled
* Rubocop correction
* Only unsub after destroy if Mailchimp newsletter is enabled
* Refactor a bit
* Fix typo
* Fix boolean logic for guard clauses
* Update tests to account for new SiteConfig logic
* Break guard clause into two clauses
* Fix deprecation warnings in Images::Optimizer
The deprecation warnings were:
warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
warning: The called method `cloudinary' is defined here
and
warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
warning: The called method `imgproxy' is defined here
* Fix deprecation warning in Slack::Messengers::ArticlePublished
The deprecation warning was:
warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
warning: The called method `initialize' is defined here