### Refactor
```ruby!
def new
set_back_roster_url
# Build template -> service || Form builder
message_templates = @school.message_templates
message_templates = message_templates.with_internal if params[:recipient] == 'internal'
@template = message_templates.new(filters: {})
@template.kind = MessageTemplate.target_to_kind.fetch(params[:target], MessageTemplate::GENERAL_TEMPLATE)
# Get filtered templates -> Model
@templates = filter_templates(@templates, unlayer: params[:unlayer], template: @template, recipient: params[:recipient], target: params[:target])
sort_folders_with_templates(@templates)
# additional settings -> private (current_user related to view layer)
@applicants = GetMessageTemplateApplicantsService.new(@template, @school, current_user).perform
@parents_will_notified = load_parents_will_notified(@template, @applicants)
@agents_will_notified = load_agents_will_notified(@template, @applicants)
# Build template & set template -> service
if (from_template_id = params['from_message_template_id'])
from_template = @school.message_templates.find_by(id: from_template_id)
if from_template
@template.subject = from_template.subject
@template.body = from_template.body
end
end
render action: :new, layout: 'nv_admin'
end
```
#### Part I - service(Form Builder)
```ruby!
# app/services/message_template_creator_service.rb
class MessageTemplateCreatorService
def initialize(school, params, current_user)
@school = school
@params = params
@current_user = current_user
end
def create_template
message_templates = @school.message_templates
message_templates = message_templates.with_internal if @params[:recipient] == 'internal'
template = message_templates.new(filters: {})
template.kind = MessageTemplate.target_to_kind.fetch(@params[:target], MessageTemplate::GENERAL_TEMPLATE)
if (from_template_id = @params['from_message_template_id'])
from_template = @school.message_templates.find_by(id: from_template_id)
if from_template
template.subject = from_template.subject
template.body = from_template.body
end
end
template
end
end
```
#### Part II - Model
```ruby!
# app/models/message_template.rb
class MessageTemplate < ApplicationRecord
def self.filter_and_sort_templates(params, school)
templates = school.message_templates
templates = templates.with_internal if params[:recipient] == 'internal'
templates
end
end
private
def load_objects
query_string = 'name != "' + MessageTemplate::SYSTEM_LEVEL_TEMPLATE_NAMES.join('" AND name != "') + '" OR name IS NULL'
@templates = @school.message_templates.where(query_string)
gon.keywords = MessageTemplate::VARIABLES
end
```
#### Part III - private
```ruby!
private
def setup_applicants
@applicants = GetMessageTemplateApplicantsService.new(@template, @school, current_user).perform
@parents_will_notified = load_parents_will_notified(@template, @applicants)
@agents_will_notified = load_agents_will_notified(@template, @applicants)
end
```
#### Result
```ruby!
def new
set_back_roster_url
@template = MessageTemplateCreatorService.new(@school, params, current_user).create_template
@templates = MessageTemplate.filter_and_sort_templates(params, @school)
setup_applicants
render action: :new, layout: 'nv_admin'
end
```