class TrendingPostsService
CACHE_KEY = 'trending_posts:v1'.freeze
CACHE_TTL = 15.minutes
def self.call(limit: 10)
Rails.cache.fetch(CACHE_KEY, expires_in: CACHE_TTL) do
module TurboResponder
extend ActiveSupport::Concern
def respond_turbo_or_html(success_redirect:, invalid_template:)
respond_to do |format|
format.turbo_stream
class CreateAuditLogs < ActiveRecord::Migration[6.1]
def change
create_table :audit_logs do |t|
t.references :user, null: true, foreign_key: true
t.string :action, null: false
t.string :resource_type
class ProcessPaymentWorker
include Sidekiq::Worker
sidekiq_options queue: :critical, retry: 10
sidekiq_retry_in do |count, exception|
<%= turbo_stream_from [current_member, :notifications] %>
<div id="notification_badge">
<%= render 'notifications/badge', count: current_member.notifications.unread.count %>
</div>
class JwtService
ACCESS_TOKEN_LIFETIME = 15.minutes
REFRESH_TOKEN_LIFETIME = 7.days
SECRET = Rails.application.credentials.jwt_secret
def self.encode_access_token(user_id)
class ApplicationController < ActionController::Base
helper_method :turbo_native_app?
private
def turbo_native_app?
class BillingController < ApplicationController
before_action :authenticate_member!
def show
turbo_cache_control :no_cache
response.headers['Cache-Control'] = 'no-store'
<%= turbo_frame_tag "sidebar" do %>
<nav>
<%= link_to "All", snips_path, data: { turbo_frame: "sidebar" } %>
<%= link_to "Trending", snips_path(filter: :trending), data: { turbo_frame: "sidebar" } %>
<%= link_to "Editors' choice", snips_path(filter: :editors_choice), data: { turbo_frame: "sidebar" } %>
</nav>
Rails.application.config.filter_parameters += [
:password,
:password_confirmation,
:token,
:authorization,
:ssn,
class DeliveryObserver
def self.delivered_email(message)
new(message).record
end
def initialize(message)
require 'ipaddr'
require 'resolv'
uri = URI.parse(params[:url])
allowed_hosts = %w[images.example-cdn.com api.partner.com]