LuanDantas
5/27/2018 - 5:55 PM

Criando os Serviços

Serviços são utilizados para encapsular métodos com muita lógica no Rails.

Criando os serviços

Neste serviço, vamos processar as informações para pegar uma categoria, um conjunto de vídeos e séries do continue assistindo ou do que estiver em destaque.

class DashboardService

  # No serviço, vamos processar as informações para pegar uma categoria, um conjunto de vídeos e séries do continue assistindo ou do que estiver em destaque.

  # Neste método, é como se fosse o construtor, onde tudo será preparado
  # Onde as variáveis são declaradas
  def initialize(type, user)
    @type = type
    @user = user
  end

  def perform
    # O método send é uma maneira para não precisar fazer um "if, else"
    # Ex: ficaria assim ( if type == 'category'  ), etc...
    # Facilita a escrita
    send("group_by_#{ @type }")
  end

  private

    # Este método carrega todos os conteúdos filtrados por categoria
    def group_by_category
      # O .includes funciona para incluir tanto filmes como série dentro do resultado
      categories = Category.includes(:movies, :series)
      Api::V1::CategorySerializer.new(categories)
    end

    # Este método carrega todos os conteúdos que o usuário ainda não terminou de assistir
    # É o "Continue assistindo"
    def group_by_keep_watching
      # O .include pega todos os filmes ou episódios, e filtra por todos que o end_date for vazio, ou seja
      # pega todos os registros que o usuário ainda não terminou de assistir
      players = Player.includes(:movie).where(end_date: nil, user: @user)

      # Como a gente não quer serializar o player e sim o registro associado a ele que é o movie, 
      # então fazemos um mapeamento com o .map
      Api::V1::MovieSerializer.new(players.map(&:movie))
    end

    # Este método carrega os conteúdos marcados como "favoritos"
    def group_by_highlight
      highlight = Movie.find_by(highlighted: true)
      highlight ||= Serie.find_by(highlight: true)
      Api::V1::WatchableSerializer.new(highlight, params: { user: @user })
    end
end