Implemented a 3 endpoint json api storing and querying data from neo4j
This commit is contained in:
parent
07d3ad1329
commit
a321111640
@ -1,6 +1,6 @@
|
|||||||
FROM ruby:3.2.2
|
FROM ruby:3.2.2
|
||||||
RUN mkdir -p /var/app
|
|
||||||
COPY . /app
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
COPY Gemfile Gemfile
|
||||||
RUN bundle install
|
RUN bundle install
|
||||||
CMD rails server -e development -b 0.0.0.0 --log-to-stdout
|
COPY . /app
|
||||||
|
CMD rails server -b 0.0.0.0 --log-to-stdout
|
||||||
|
|||||||
20
Gemfile
20
Gemfile
@ -13,16 +13,7 @@ gem "sqlite3", "~> 1.4"
|
|||||||
gem "puma", "~> 5.0"
|
gem "puma", "~> 5.0"
|
||||||
|
|
||||||
# Build JSON APIs with ease [https://github.com/rails/jbuilder]
|
# Build JSON APIs with ease [https://github.com/rails/jbuilder]
|
||||||
# gem "jbuilder"
|
gem "jbuilder"
|
||||||
|
|
||||||
# Use Redis adapter to run Action Cable in production
|
|
||||||
# gem "redis", "~> 4.0"
|
|
||||||
|
|
||||||
# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]
|
|
||||||
# gem "kredis"
|
|
||||||
|
|
||||||
# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]
|
|
||||||
# gem "bcrypt", "~> 3.1.7"
|
|
||||||
|
|
||||||
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||||
gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]
|
gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]
|
||||||
@ -30,11 +21,10 @@ gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]
|
|||||||
# Reduces boot times through caching; required in config/boot.rb
|
# Reduces boot times through caching; required in config/boot.rb
|
||||||
gem "bootsnap", require: false
|
gem "bootsnap", require: false
|
||||||
|
|
||||||
# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
|
# From Neo4J.rb documentation
|
||||||
# gem "image_processing", "~> 1.2"
|
gem 'activegraph', '~> 11.3'
|
||||||
|
gem 'neo4j-ruby-driver', '~> 4.4.3'
|
||||||
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
|
gem 'neo4j-rake_tasks'
|
||||||
# gem "rack-cors"
|
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
|
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
|
||||||
|
|||||||
53
Gemfile.lock
53
Gemfile.lock
@ -46,6 +46,13 @@ GEM
|
|||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
|
activegraph (11.3.1)
|
||||||
|
activemodel (>= 4.0)
|
||||||
|
activesupport (>= 4.0)
|
||||||
|
i18n (!= 1.8.8)
|
||||||
|
neo4j-ruby-driver (>= 4.4.1)
|
||||||
|
orm_adapter (~> 0.5.0)
|
||||||
|
sorted_set
|
||||||
activejob (7.0.4.3)
|
activejob (7.0.4.3)
|
||||||
activesupport (= 7.0.4.3)
|
activesupport (= 7.0.4.3)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
@ -66,23 +73,37 @@ GEM
|
|||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
tzinfo (~> 2.0)
|
tzinfo (~> 2.0)
|
||||||
|
async (2.5.1)
|
||||||
|
console (~> 1.10)
|
||||||
|
io-event (~> 1.1)
|
||||||
|
timers (~> 4.1)
|
||||||
|
async-io (1.34.3)
|
||||||
|
async
|
||||||
bootsnap (1.16.0)
|
bootsnap (1.16.0)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
builder (3.2.4)
|
builder (3.2.4)
|
||||||
concurrent-ruby (1.2.2)
|
concurrent-ruby (1.2.2)
|
||||||
|
connection_pool (2.4.1)
|
||||||
|
console (1.16.2)
|
||||||
|
fiber-local
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
date (3.3.3)
|
date (3.3.3)
|
||||||
debug (1.8.0)
|
debug (1.8.0)
|
||||||
irb (>= 1.5.0)
|
irb (>= 1.5.0)
|
||||||
reline (>= 0.3.1)
|
reline (>= 0.3.1)
|
||||||
erubi (1.12.0)
|
erubi (1.12.0)
|
||||||
|
fiber-local (1.0.0)
|
||||||
globalid (1.1.0)
|
globalid (1.1.0)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
i18n (1.13.0)
|
i18n (1.13.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
io-console (0.6.0)
|
io-console (0.6.0)
|
||||||
|
io-event (1.2.2)
|
||||||
irb (1.6.4)
|
irb (1.6.4)
|
||||||
reline (>= 0.3.0)
|
reline (>= 0.3.0)
|
||||||
|
jbuilder (2.11.5)
|
||||||
|
actionview (>= 5.0.0)
|
||||||
|
activesupport (>= 5.0.0)
|
||||||
loofah (2.21.3)
|
loofah (2.21.3)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.12.0)
|
||||||
@ -96,6 +117,16 @@ GEM
|
|||||||
mini_mime (1.1.2)
|
mini_mime (1.1.2)
|
||||||
minitest (5.18.0)
|
minitest (5.18.0)
|
||||||
msgpack (1.7.1)
|
msgpack (1.7.1)
|
||||||
|
neo4j-rake_tasks (0.7.19)
|
||||||
|
os
|
||||||
|
rake
|
||||||
|
ruby-progressbar
|
||||||
|
rubyzip (>= 1.1.7)
|
||||||
|
neo4j-ruby-driver (4.4.4)
|
||||||
|
activesupport
|
||||||
|
async-io
|
||||||
|
connection_pool
|
||||||
|
zeitwerk (>= 2.1.10)
|
||||||
net-imap (0.3.4)
|
net-imap (0.3.4)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
@ -106,8 +137,14 @@ GEM
|
|||||||
net-smtp (0.3.3)
|
net-smtp (0.3.3)
|
||||||
net-protocol
|
net-protocol
|
||||||
nio4r (2.5.9)
|
nio4r (2.5.9)
|
||||||
|
nokogiri (1.15.1-aarch64-linux)
|
||||||
|
racc (~> 1.4)
|
||||||
nokogiri (1.15.1-arm64-darwin)
|
nokogiri (1.15.1-arm64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
|
nokogiri (1.15.1-x86_64-linux)
|
||||||
|
racc (~> 1.4)
|
||||||
|
orm_adapter (0.5.0)
|
||||||
|
os (1.1.4)
|
||||||
puma (5.6.5)
|
puma (5.6.5)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
racc (1.6.2)
|
racc (1.6.2)
|
||||||
@ -141,11 +178,21 @@ GEM
|
|||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
zeitwerk (~> 2.5)
|
zeitwerk (~> 2.5)
|
||||||
rake (13.0.6)
|
rake (13.0.6)
|
||||||
|
rbtree (0.4.6)
|
||||||
reline (0.3.4)
|
reline (0.3.4)
|
||||||
io-console (~> 0.5)
|
io-console (~> 0.5)
|
||||||
|
ruby-progressbar (1.13.0)
|
||||||
|
rubyzip (2.3.2)
|
||||||
|
set (1.0.3)
|
||||||
|
sorted_set (1.0.3)
|
||||||
|
rbtree
|
||||||
|
set (~> 1.0)
|
||||||
|
sqlite3 (1.6.3-aarch64-linux)
|
||||||
sqlite3 (1.6.3-arm64-darwin)
|
sqlite3 (1.6.3-arm64-darwin)
|
||||||
|
sqlite3 (1.6.3-x86_64-linux)
|
||||||
thor (1.2.2)
|
thor (1.2.2)
|
||||||
timeout (0.3.2)
|
timeout (0.3.2)
|
||||||
|
timers (4.3.5)
|
||||||
tzinfo (2.0.6)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
websocket-driver (0.7.5)
|
websocket-driver (0.7.5)
|
||||||
@ -154,11 +201,17 @@ GEM
|
|||||||
zeitwerk (2.6.8)
|
zeitwerk (2.6.8)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
|
aarch64-linux
|
||||||
arm64-darwin-22
|
arm64-darwin-22
|
||||||
|
x86_64-linux
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
activegraph (~> 11.3)
|
||||||
bootsnap
|
bootsnap
|
||||||
debug
|
debug
|
||||||
|
jbuilder
|
||||||
|
neo4j-rake_tasks
|
||||||
|
neo4j-ruby-driver (~> 4.4.3)
|
||||||
puma (~> 5.0)
|
puma (~> 5.0)
|
||||||
rails (~> 7.0.4, >= 7.0.4.3)
|
rails (~> 7.0.4, >= 7.0.4.3)
|
||||||
sqlite3 (~> 1.4)
|
sqlite3 (~> 1.4)
|
||||||
|
|||||||
@ -1,26 +1,38 @@
|
|||||||
class MetricsController < ActionController::API
|
class MetricsController < ActionController::API
|
||||||
|
|
||||||
# GET /metric
|
|
||||||
def index
|
|
||||||
render json: {}
|
|
||||||
end
|
|
||||||
|
|
||||||
# POST /metric/:key
|
# POST /metric/:key
|
||||||
def create
|
def create
|
||||||
key = params[:key]
|
key = params[:key]
|
||||||
|
value = JSON.parse(request.body.read)["value"]
|
||||||
|
|
||||||
|
metric = Metric.find_or_create_by(key: key)
|
||||||
|
metric.value = value
|
||||||
|
|
||||||
|
if metric.save()
|
||||||
render json: {}
|
render json: {}
|
||||||
|
else
|
||||||
|
render json: { error: "Unable to save" }, status: :unprocessable_entity
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# GET /metric/:key
|
# GET /metric/
|
||||||
def show
|
def index
|
||||||
# Return an empty JSON response
|
returnable = []
|
||||||
render json: {}
|
Metric.all.each do |metric|
|
||||||
|
returnable << MetricOutput.new(metric.key, metric.value)
|
||||||
|
end
|
||||||
|
render json: returnable.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
# DELETE /metric/:key
|
# DELETE /metric/:key
|
||||||
def delete
|
def delete
|
||||||
key = params[:key]
|
key = params[:key]
|
||||||
|
metric = Metric.find_by(key: key)
|
||||||
|
if metric.destroy
|
||||||
render json: {}
|
render json: {}
|
||||||
|
else
|
||||||
|
render json: { error: "Unable to delete" }, status: :unprocessable_entity
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
10
app/helpers/MetricOutput.rb
Normal file
10
app/helpers/MetricOutput.rb
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
class MetricOutput
|
||||||
|
attr_reader :key, :value
|
||||||
|
|
||||||
|
def initialize(key, value)
|
||||||
|
@key = key
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
7
app/models/metric.rb
Normal file
7
app/models/metric.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
class Metric
|
||||||
|
include ActiveGraph::Node
|
||||||
|
property :key, type: String
|
||||||
|
property :value, type: Integer, default: 0
|
||||||
|
validates :key, :presence => true
|
||||||
|
|
||||||
|
end
|
||||||
@ -1,6 +1,7 @@
|
|||||||
require_relative "boot"
|
require_relative "boot"
|
||||||
|
|
||||||
require "rails/all"
|
require "rails/all"
|
||||||
|
require 'active_graph/railtie'
|
||||||
|
|
||||||
# Require the gems listed in Gemfile, including any gems
|
# Require the gems listed in Gemfile, including any gems
|
||||||
# you've limited to :test, :development, or :production.
|
# you've limited to :test, :development, or :production.
|
||||||
@ -10,7 +11,7 @@ module GrilloTest
|
|||||||
class Application < Rails::Application
|
class Application < Rails::Application
|
||||||
# Initialize configuration defaults for originally generated Rails version.
|
# Initialize configuration defaults for originally generated Rails version.
|
||||||
config.load_defaults 7.0
|
config.load_defaults 7.0
|
||||||
|
config.generators { |g| g.orm :active_graph }
|
||||||
# Configuration for the application, engines, and railties goes here.
|
# Configuration for the application, engines, and railties goes here.
|
||||||
#
|
#
|
||||||
# These settings can be overridden in specific environments using the files
|
# These settings can be overridden in specific environments using the files
|
||||||
|
|||||||
11
db/neo4j/migrate/20230524023145_create_metric.rb
Normal file
11
db/neo4j/migrate/20230524023145_create_metric.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class CreateMetric < ActiveGraph::Migrations::Base
|
||||||
|
disable_transactions!
|
||||||
|
|
||||||
|
def up
|
||||||
|
add_constraint :Metric, :uuid
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
drop_constraint :Metric, :uuid
|
||||||
|
end
|
||||||
|
end
|
||||||
21
db/neo4j/schema.yml
Normal file
21
db/neo4j/schema.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# This file is auto-generated from the current state of the database. Instead
|
||||||
|
# of editing this file, please use the migrations feature of Node to
|
||||||
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
|
#
|
||||||
|
# Note that this schema.yml definition is the authoritative source for your
|
||||||
|
# database schema. If you need to create the application database on another
|
||||||
|
# system, you should be using neo4j:schema:load, not running all the migrations
|
||||||
|
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||||
|
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
||||||
|
#
|
||||||
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
|
---
|
||||||
|
:constraints:
|
||||||
|
- 'CREATE CONSTRAINT `constraint_3d18f4d7` FOR (n:`Metric`) REQUIRE (n.`uuid`) IS
|
||||||
|
UNIQUE OPTIONS {indexConfig: {}, indexProvider: ''range-1.0''}'
|
||||||
|
- 'CREATE CONSTRAINT `constraint_dbcee0a4` FOR (n:`ActiveGraph::Migrations::SchemaMigration`)
|
||||||
|
REQUIRE (n.`migration_id`) IS UNIQUE OPTIONS {indexConfig: {}, indexProvider: ''range-1.0''}'
|
||||||
|
:indexes: []
|
||||||
|
:versions:
|
||||||
|
- '20230524023145'
|
||||||
@ -9,5 +9,23 @@ services:
|
|||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- "./:/app"
|
- "./:/app"
|
||||||
|
depends_on:
|
||||||
|
- neo4j
|
||||||
environment:
|
environment:
|
||||||
|
- NEO4J_URL=bolt://neo4j:7687
|
||||||
- ENVIRONMENT=development
|
- ENVIRONMENT=development
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
neo4j:
|
||||||
|
image: neo4j
|
||||||
|
ports:
|
||||||
|
- "7474:7474"
|
||||||
|
- "7687:7687"
|
||||||
|
volumes:
|
||||||
|
- ./neo4j:/data
|
||||||
|
- ./neo4j/logs:/logs
|
||||||
|
environment:
|
||||||
|
- NEO4J_AUTH=none
|
||||||
|
#- dbms.connector.bolt.listen_address=:7687
|
||||||
|
#- dbms.connector.bolt.advertised_address=:7687
|
||||||
|
|
||||||
|
|||||||
18
justfile
Normal file
18
justfile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
build:
|
||||||
|
docker compose build
|
||||||
|
|
||||||
|
run:
|
||||||
|
docker compose up
|
||||||
|
|
||||||
|
shell:
|
||||||
|
docker compose run app bash
|
||||||
|
|
||||||
|
migrate:
|
||||||
|
docker compose run app rails neo4j:migrate
|
||||||
|
|
||||||
|
clean-db:
|
||||||
|
rm -rf neo4j
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf tmp/pids/server.pid
|
||||||
|
|
||||||
11
test/fixtures/metrics.yml
vendored
Normal file
11
test/fixtures/metrics.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||||
|
|
||||||
|
# This model initially had no columns defined. If you add columns to the
|
||||||
|
# model remove the "{}" from the fixture names and add the columns immediately
|
||||||
|
# below each fixture, per the syntax in the comments below
|
||||||
|
#
|
||||||
|
one: {}
|
||||||
|
# column: value
|
||||||
|
#
|
||||||
|
two: {}
|
||||||
|
# column: value
|
||||||
7
test/models/metric_test.rb
Normal file
7
test/models/metric_test.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
require "test_helper"
|
||||||
|
|
||||||
|
class MetricTest < ActiveSupport::TestCase
|
||||||
|
# test "the truth" do
|
||||||
|
# assert true
|
||||||
|
# end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user