* Rate limit daily user follows to 500 per day Return an error in `POST /follows` JSON response when a user tries to follow more than 500 accounts in a single day. Other Changes: - Add a spec for follows#create. * Turn daily account follow limit into an env var * Avoid executing today follow count query when possible user.following_users_count is a counter cache on how many users the person is already following, so if it's less than the limit we don't need to run the query and can just return it instead. * Simplify today follow count query Stop needlessly checking into the future, only check from the beginning of the day until now. * Raise account follow limit error if followable_id count is over limit Other changes: - Always return JSON, the `respond_to` block from before was unnecessary since this endpoint always returns JSON. - Rescue `DailyFollowAccountLimitReached` on the method and remove begin block, since the error can be raised from two places in the same method. * Index created_at on users table * Make adding created_at index on users table happen concurrently * Rename DAILY_ACCOUNT_FOLLOW_LIMIT to RATE_LIMIT_FOLLOW_COUNT_DAILY * Add RATE_LIMIT_FOLLOW_COUNT_DAILY to Envfile * Move RATE_LIMIT_FOLLOW_COUNT_DAILY from env var to ApplicationConfig
219 lines
8.5 KiB
Text
219 lines
8.5 KiB
Text
# Most of the things are optional. If you need to use a
|
|
# custom key, please create an application.yml for it
|
|
|
|
enable_defaults! { ENV["RACK_ENV"] != "production" }
|
|
|
|
################################################
|
|
############## Basic configuration #############
|
|
################################################
|
|
|
|
# App domain + Protocol setting for development
|
|
variable :APP_DOMAIN, :String, default: "localhost:3000"
|
|
variable :APP_PROTOCOL, :String, default: "http://"
|
|
variable :COMMUNITY_NAME, :String, default: "DEV(local)"
|
|
variable :MAIN_SOCIAL_IMAGE, :String, default: "https://thepracticaldev.s3.amazonaws.com/i/6hqmcjaxbgbon8ydw93z.png"
|
|
variable :SITE_TWITTER_HANDLE, :String, default: "tbd"
|
|
variable :RATE_LIMIT_FOLLOW_COUNT_DAILY, :Integer, default: 500
|
|
variable :FAVICON_URL, :String, default: "favicon.ico"
|
|
|
|
# Logo
|
|
variable :LOGO_SVG, :String, default: ""
|
|
|
|
# Default staff account's id
|
|
variable :DEVTO_USER_ID, :Integer, default: 1
|
|
|
|
# Default site email
|
|
variable :DEFAULT_SITE_EMAIL, :String, default: "yo@dev.to"
|
|
|
|
# Service timeout length
|
|
variable :RACK_TIMEOUT_WAIT_TIMEOUT, :Integer, default: 100_000
|
|
variable :RACK_TIMEOUT_SERVICE_TIMEOUT, :Integer, default: 100_000
|
|
|
|
# Production related config that can be ignored
|
|
variable :DEPLOYMENT_SIGNATURE, :String, default: "Optional"
|
|
|
|
# For Redis storage
|
|
variable :REDIS_URL, :String, default: "redis://localhost:6379"
|
|
|
|
################################################
|
|
############## 3rd Party Services ##############
|
|
################################################
|
|
|
|
# It's best if you have the following configured
|
|
# for more development experience
|
|
|
|
# Github for github related access
|
|
# (https://developer.github.com/v3/guides/basics-of-authentication/)
|
|
variable :GITHUB_KEY, :String, default: "Optional"
|
|
variable :GITHUB_SECRET, :String, default: "Optional"
|
|
variable :GITHUB_TOKEN, :String, default: "Optional"
|
|
|
|
# Twitter for normal twitter access
|
|
# (https://developer.twitter.com/en/docs/basics/authentication/guides/access-tokens)
|
|
variable :TWITTER_ACCESS_TOKEN, :String, default: "Optional"
|
|
variable :TWITTER_ACCESS_TOKEN_SECRET, :String, default: "Optional"
|
|
variable :TWITTER_KEY, :String, default: "Optional"
|
|
variable :TWITTER_SECRET, :String, default: "Optional"
|
|
|
|
################################################
|
|
######### Optional 3rd Party Services ##########
|
|
################################################
|
|
|
|
# Airbrake for error tracking
|
|
# (https://airbrake.io/docs/api/#authentication)
|
|
variable :AIRBRAKE_API_KEY, :String, default: "Optional"
|
|
variable :AIRBRAKE_PROJECT_ID, :integer, default: 0o0000
|
|
|
|
# Algolia for search (not optional)
|
|
# (https://www.algolia.com/doc/)
|
|
only_in_test = proc { ENV["RACK_ENV"] == "test" ? "test-test" : nil }
|
|
variable :ALGOLIASEARCH_API_KEY, :String, default: only_in_test
|
|
variable :ALGOLIASEARCH_APPLICATION_ID, :String, default: only_in_test
|
|
variable :ALGOLIASEARCH_SEARCH_ONLY_KEY, :String, default: only_in_test
|
|
|
|
# AWS for images storages
|
|
variable :AWS_ID, :String, default: "Optional"
|
|
variable :AWS_SECRET, :String, default: "Optional"
|
|
variable :AWS_BUCKET_NAME, :String, default: "Optional"
|
|
|
|
# AWS SDK
|
|
# (https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html)
|
|
variable :AWS_DEFAULT_REGION, :String, default: "us-east-1"
|
|
variable :AWS_SDK_KEY, :String, default: "Optional"
|
|
variable :AWS_SDK_SECRET, :String, default: "Optional"
|
|
|
|
# AWS for video storage
|
|
variable :AWS_S3_INPUT_BUCKET, :String, default: "Optional"
|
|
variable :AWS_S3_VIDEO_ID, :String, default: "Optional"
|
|
variable :AWS_S3_VIDEO_KEY, :String, default: "Optional"
|
|
|
|
# Buffer for sending to buffer
|
|
# (https://buffer.com/developers/api)
|
|
variable :BUFFER_ACCESS_TOKEN, :String, default: "Optional"
|
|
variable :BUFFER_FACEBOOK_ID, :String, default: "Optional"
|
|
variable :BUFFER_LINKEDIN_ID, :String, default: "Optional"
|
|
variable :BUFFER_PROFILE_ID, :Integer, default: 0
|
|
variable :BUFFER_TWITTER_ID, :String, default: "Optional"
|
|
variable :BUFFER_LISTINGS_PROFILE, :String, default: "Optional"
|
|
|
|
# Cloudinary for image resizing and cache??
|
|
# (https://cloudinary.com/documentation/rails_integration)
|
|
variable :CLOUDINARY_API_KEY, :String, default: "Optional"
|
|
variable :CLOUDINARY_API_SECRET, :String, default: "Optional"
|
|
variable :CLOUDINARY_CLOUD_NAME, :String, default: "Optional"
|
|
variable :CLOUDINARY_SECURE, :String, default: "Optional"
|
|
|
|
# HTML/CSS to Image for generating social preview images
|
|
# (https://docs.htmlcsstoimage.com/example-code/ruby)
|
|
variable :HCTI_API_USER_ID, :String, default: "Optional"
|
|
variable :HCTI_API_KEY, :String, default: "Optional"
|
|
|
|
# Dacast for streaming
|
|
# (https://www.dacast.com/video-api-documentation/)
|
|
variable :DACAST_STREAM_CODE, :String, default: "Optional"
|
|
|
|
# Fastly for edge caching
|
|
# (https://docs.fastly.com/api/)
|
|
variable :FASTLY_API_KEY, :String, default: "Optional"
|
|
variable :FASTLY_SERVICE_ID, :String, default: "Optional"
|
|
|
|
# Honeycomb for monitoring and observability
|
|
# (https://www.honeycomb.io/)
|
|
variable :HONEYCOMB_API_KEY, :String, default: ""
|
|
|
|
# Google analytic
|
|
# (https://developers.google.com/analytics/devguides/reporting/core/v4)
|
|
variable :GA_SERVICE_ACCOUNT_JSON, :String, default: "Optional"
|
|
variable :GA_TRACKING_ID, :String, default: "Optional"
|
|
variable :GA_OPTIMIZE_ID, :String, default: "Optional"
|
|
variable :GA_VIEW_ID, :String, default: "Optional"
|
|
variable :GA_FETCH_RATE, :Integer, default: 25
|
|
|
|
# Mailchimp for mails
|
|
# (https://mailchimp.com/developer/)
|
|
variable :MAILCHIMP_API_KEY, :String, default: "Optional-valid"
|
|
variable :MAILCHIMP_NEWSLETTER_ID, :String, default: "Optional"
|
|
variable :MAILCHIMP_SUSTAINING_MEMBERS_ID, :String, default: "Optional"
|
|
variable :MAILCHIMP_TAG_MODERATORS_ID, :String, default: "Optional"
|
|
variable :MAILCHIMP_COMMUNITY_MODERATORS_ID, :String, default: "Optional"
|
|
|
|
# Email digest frequency
|
|
variable :PERIODIC_EMAIL_DIGEST_MAX, :Integer, default: 0
|
|
variable :PERIODIC_EMAIL_DIGEST_MIN, :Integer, default: 2
|
|
|
|
# Pusher for DEV Connect/notfications
|
|
# (https://pusher.com/docs)
|
|
variable :PUSHER_APP_ID, :String, default: "Optional"
|
|
variable :PUSHER_CLUSTER, :String, default: "Optional"
|
|
variable :PUSHER_KEY, :String, default: "Optional"
|
|
variable :PUSHER_SECRET, :String, default: "Optional"
|
|
variable :PUSHER_BEAMS_ID, :String, default: "Optional"
|
|
variable :PUSHER_BEAMS_KEY, :String, default: "Optional"
|
|
|
|
# Google recaptcha
|
|
# (https://developers.google.com/recaptcha/intro)
|
|
variable :RECAPTCHA_SECRET, :String, default: "Optional"
|
|
variable :RECAPTCHA_SITE, :String, default: "Optional"
|
|
|
|
# Slack for customer alerts
|
|
# (https://api.slack.com/)
|
|
variable :SLACK_CHANNEL, :String, default: ""
|
|
variable :SLACK_WEBHOOK_URL, :String, default: ""
|
|
|
|
# Stripe for payment system
|
|
# (https://stripe.com/docs/api)
|
|
variable :STRIPE_PUBLISHABLE_KEY, :String, default: "Optional"
|
|
variable :STRIPE_SECRET_KEY, :String, default: "Optional"
|
|
variable :STRIPE_CANCELLATION_SECRET, :String, default: "Optional"
|
|
|
|
# For browser webpush notifications (webpush gem) (totally random base64 nums)
|
|
# (https://github.com/zaru/webpush)
|
|
variable :VAPID_PUBLIC_KEY, :String, default: "dGhpcyBpcyBkZXYudG8gdGVzdCBkYXRh"
|
|
variable :VAPID_PRIVATE_KEY, :String, default: "VGhpcyBpcyBtb3JlIHRlc3QgZGF0YQ=="
|
|
|
|
# For video calling in DEV Connect
|
|
# (https://www.twilio.com/docs/video)
|
|
variable :TWILIO_ACCOUNT_SID, :String, default: "Optional"
|
|
variable :TWILIO_VIDEO_API_KEY, :String, default: "Optional"
|
|
variable :TWILIO_VIDEO_API_SECRET, :String, default: "Optional"
|
|
|
|
# For Twitch live stream integration
|
|
# (https://dev.twitch.tv/docs)
|
|
variable :TWITCH_CLIENT_ID, :String, default: "Optional"
|
|
variable :TWITCH_CLIENT_SECRET, :String, default: "Optional"
|
|
variable :TWITCH_WEBHOOK_SECRET, :String, default: "Optional"
|
|
|
|
# Trending tags on home page
|
|
variable :TRENDING_TAGS, :String, default: "git,beginners"
|
|
|
|
# For calling the Stack Exchange API
|
|
# (https://api.stackexchange.com/docs)
|
|
variable :STACK_EXCHANGE_APP_KEY, :String, default: ""
|
|
|
|
##### Legacy test related env vars ######
|
|
variable :FACEBOOK_PIXEL_ID, :String, default: "Optional"
|
|
variable :SMARTY_STREETS_WEB_KEY, :String, default: "Optional"
|
|
|
|
group :production do
|
|
variable :SECRET_KEY_BASE, :String
|
|
|
|
# Timber
|
|
# (https://docs.timber.io/)
|
|
variable :SEND_LOGS_TO_TIMBER, :String # Defaults to true in production, false in development
|
|
variable :TIMBER, :String # Only required if above is "true" or unset
|
|
|
|
# Memcachier
|
|
# (https://www.memcachier.com/documentation/rails)
|
|
variable :MEMCACHIER_SERVERS, :String
|
|
variable :MEMCACHIER_USERNAME, :String
|
|
variable :MEMCACHIER_PASSWORD, :String
|
|
|
|
# Sendgrid
|
|
# (https://sendgrid.com/docs/API_Reference/api_v3.html)
|
|
variable :SENDGRID_USERNAME_ACCEL, :String
|
|
variable :SENDGRID_PASSWORD_ACCEL, :String
|
|
|
|
# Heroku
|
|
variable :HEROKU_APP_URL, :String # practicaldev.herokuapp.com
|
|
|
|
end
|