Class: Observ::PromptsController

Inherits:
ApplicationController show all
Defined in:
app/controllers/observ/prompts_controller.rb

Instance Method Summary collapse

Instance Method Details

#compareObject

GET /observ/prompts/:id/compare?from=1&to=2



150
151
152
153
154
155
156
157
158
159
160
161
# File 'app/controllers/observ/prompts_controller.rb', line 150

def compare
  @from_version = Observ::Prompt.find_by(name: @prompt_name, version: params[:from])
  @to_version = Observ::Prompt.find_by(name: @prompt_name, version: params[:to])

  unless @from_version && @to_version
    redirect_to versions_prompt_path(@prompt_name),
      alert: "Both versions must be specified"
    return
  end

  @diff = calculate_diff(@from_version.prompt, @to_version.prompt)
end

#createObject

POST /observ/prompts



50
51
52
53
54
55
56
57
58
59
60
# File 'app/controllers/observ/prompts_controller.rb', line 50

def create
  @form = Observ::PromptForm.new(form_params)
  @form.created_by = current_user_identifier

  if @form.save
    redirect_to prompt_path(@form.persisted_prompt.name),
      notice: "Prompt created successfully (v#{@form.persisted_prompt.version})"
  else
    render :new, status: :unprocessable_content
  end
end

#destroyObject

DELETE /observ/prompts/:id



124
125
126
127
128
129
130
131
132
133
134
# File 'app/controllers/observ/prompts_controller.rb', line 124

def destroy
  # Can only delete draft and archived prompts
  if @prompt.production?
    redirect_to prompt_path(@prompt_name),
      alert: "Cannot delete production prompts"
    return
  end

  @prompt.destroy
  redirect_to prompts_path, notice: "Prompt version #{@prompt.version} deleted"
end

#editObject

GET /observ/prompts/:id/edit



87
88
89
90
91
92
93
# File 'app/controllers/observ/prompts_controller.rb', line 87

def edit
  # Only draft prompts can be edited
  unless @prompt.draft?
    redirect_to prompt_path(@prompt_name),
      alert: "Only draft prompts can be edited. Clone this version to create an editable draft."
  end
end

#indexObject

GET /observ/prompts



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/controllers/observ/prompts_controller.rb', line 7

def index
  @prompts = Observ::Prompt.select(:name)
    .distinct
    .order(:name)

  # Apply search filter
  if params[:search].present?
    @prompts = @prompts.where("name LIKE ? COLLATE NOCASE", "%#{params[:search]}%")
  end

  # Apply state filter
  if params[:state].present?
    @prompts = @prompts.where(state: params[:state])
  end

  @prompts = @prompts.page(params[:page]).per(Observ.config.pagination_per_page)

  # Enrich with metadata for display
  @prompt_data = @prompts.map do |prompt|
    latest = Observ::Prompt.where(name: prompt.name).order(version: :desc).first
    production = Observ::Prompt.where(name: prompt.name, state: :production).first

    {
      name: prompt.name,
      total_versions: Observ::Prompt.where(name: prompt.name).count,
      production_version: production&.version,
      latest_version: latest.version,
      latest_state: latest.state,
      last_updated: latest.updated_at,
      has_draft: Observ::Prompt.where(name: prompt.name, state: :draft).exists?
    }
  end
end

#newObject

GET /observ/prompts/new



42
43
44
45
46
47
# File 'app/controllers/observ/prompts_controller.rb', line 42

def new
  @form = Observ::PromptForm.new(
    name: params[:name],
    from_version: params[:from_version]
  )
end

#showObject

GET /observ/prompts/:id



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'app/controllers/observ/prompts_controller.rb', line 63

def show
  # Get production version by default, or latest version if no production
  @prompt = Observ::Prompt.where(name: @prompt_name, state: :production).first ||
            Observ::Prompt.where(name: @prompt_name).order(version: :desc).first

  unless @prompt
    redirect_to prompts_path, alert: "Prompt not found"
    return
  end

  # Load specific version if requested
  if params[:version].present?
    @prompt = Observ::Prompt.find_by(name: @prompt_name, version: params[:version])
    unless @prompt
      redirect_to prompt_path(@prompt_name), alert: "Version not found"
      return
    end
  end

  @all_versions = Observ::Prompt.where(name: @prompt_name).order(version: :desc)
  @production_version = @all_versions.find(&:production?)
end

#updateObject

PATCH /observ/prompts/:id



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'app/controllers/observ/prompts_controller.rb', line 96

def update
  unless @prompt.draft?
    redirect_to prompt_path(@prompt_name),
      alert: "Only draft prompts can be edited"
    return
  end

  # Parse config JSON string before updating
  update_params = prompt_params.except(:name, :version, :promote_to_production)
  if update_params[:config].present?
    parsed = parse_config(update_params[:config])
    if parsed.nil?
      # JSON parsing failed, re-render form with error
      render :edit, status: :unprocessable_content
      return
    end
    update_params[:config] = parsed
  end

  if @prompt.update(update_params)
    redirect_to prompt_path(@prompt_name, version: @prompt.version),
      notice: "Prompt updated successfully"
  else
    render :edit, status: :unprocessable_content
  end
end

#versionsObject

GET /observ/prompts/:id/versions



137
138
139
140
141
142
143
144
145
146
147
# File 'app/controllers/observ/prompts_controller.rb', line 137

def versions
  @versions = Observ::Prompt.where(name: @prompt_name).order(version: :desc)
  @production_version = @versions.find(&:production?)

  respond_to do |format|
    format.html # Render the HTML view
    format.json do
      render json: @versions.as_json(only: [:version, :state, :commit_message, :created_at])
    end
  end
end