2023-02-04 23:43:57 +00:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'connection_pool'
|
|
|
|
require 'pg'
|
|
|
|
require 'sinatra'
|
2023-02-05 02:44:16 +00:00
|
|
|
require 'sinatra/json'
|
2023-02-04 23:43:57 +00:00
|
|
|
|
|
|
|
$DB_POOL = ConnectionPool.new size: 5, timeout: 5 do
|
|
|
|
PG.connect(
|
|
|
|
host: 'pg.causa-arcana.com',
|
|
|
|
dbname: 'leqsikoni',
|
|
|
|
user: 'leqsikoni',
|
|
|
|
password: 'ggeucene3ou7mqh2upehhm52tfp5bkcj',
|
2023-02-05 01:18:22 +00:00
|
|
|
).tap do |conn|
|
|
|
|
conn.type_map_for_results = PG::BasicTypeMapForResults.new conn
|
|
|
|
end
|
2023-02-04 23:43:57 +00:00
|
|
|
end
|
|
|
|
|
2023-02-05 02:53:47 +00:00
|
|
|
before do
|
|
|
|
headers 'Access-Control-Allow-Origin' => '*'
|
|
|
|
end
|
|
|
|
|
2023-02-11 05:54:34 +00:00
|
|
|
get '/words/:id' do
|
2023-02-04 23:43:57 +00:00
|
|
|
$DB_POOL.with do |db_conn|
|
2023-02-11 05:54:34 +00:00
|
|
|
word_id = Integer params[:id]
|
2023-02-05 01:18:22 +00:00
|
|
|
|
2023-02-18 07:59:47 +00:00
|
|
|
part_of_speech_name = db_conn.exec_params(
|
|
|
|
(
|
|
|
|
<<~SQL
|
|
|
|
SELECT parts.english_name
|
|
|
|
FROM words
|
|
|
|
INNER JOIN parts
|
|
|
|
ON words.part_id = parts.id
|
|
|
|
WHERE words.id = $1
|
|
|
|
LIMIT 1
|
|
|
|
SQL
|
|
|
|
),
|
|
|
|
[word_id],
|
2023-02-18 08:07:11 +00:00
|
|
|
).values.first&.first
|
2023-02-18 07:59:47 +00:00
|
|
|
|
2023-02-05 01:18:22 +00:00
|
|
|
examples = db_conn.exec_params(
|
|
|
|
(
|
|
|
|
<<~SQL
|
|
|
|
SELECT
|
|
|
|
array_agg(foo.value ORDER BY foo.language_id DESC)::text[] AS values
|
|
|
|
FROM example_texts foo
|
|
|
|
INNER JOIN (
|
|
|
|
SELECT example_id, language_id, MIN(index) as min_index
|
|
|
|
FROM example_texts
|
|
|
|
WHERE
|
2023-02-11 05:54:34 +00:00
|
|
|
example_id = ANY(
|
|
|
|
SELECT example_texts.example_id
|
|
|
|
FROM words
|
|
|
|
INNER JOIN word_forms
|
|
|
|
ON word_forms.word_id = words.id
|
|
|
|
INNER JOIN word_form_example_texts
|
|
|
|
ON word_form_example_texts.word_form_id = word_forms.id
|
|
|
|
INNER JOIN example_texts
|
|
|
|
ON example_texts.id = word_form_example_texts.example_text_id
|
|
|
|
WHERE words.id = $1
|
|
|
|
GROUP BY example_texts.example_id
|
|
|
|
)
|
2023-02-05 01:18:22 +00:00
|
|
|
AND
|
|
|
|
(language_id = 5 OR language_id = 2)
|
|
|
|
GROUP BY example_id, language_id
|
|
|
|
) bar
|
|
|
|
ON
|
|
|
|
foo.example_id = bar.example_id AND
|
|
|
|
foo.language_id = bar.language_id AND
|
|
|
|
foo.index = bar.min_index
|
|
|
|
GROUP BY foo.example_id
|
|
|
|
SQL
|
|
|
|
),
|
2023-02-11 05:54:34 +00:00
|
|
|
[word_id],
|
2023-02-05 01:18:22 +00:00
|
|
|
).map { |row| row['values'] }
|
|
|
|
|
2023-02-11 05:54:34 +00:00
|
|
|
json({
|
2023-02-18 07:59:47 +00:00
|
|
|
part_of_speech: part_of_speech_name,
|
2023-02-11 05:54:34 +00:00
|
|
|
examples: examples,
|
|
|
|
})
|
2023-02-04 23:43:57 +00:00
|
|
|
end
|
|
|
|
end
|