Don't forget to lycansubscribe

added API endpoint for search (dev mode)

Changed files
+71
app
bin
+7
Gemfile
··· 7 7 gem 'irb' 8 8 gem 'rainbow' 9 9 10 + gem 'sinatra' 11 + 10 12 gem 'minisky', '~> 0.5' 11 13 gem 'didkit', '~> 0.2', git: 'https://tangled.sh/@mackuba.eu/didkit' 14 + 15 + group :development do 16 + gem 'puma' 17 + gem 'rackup' 18 + end
+8
Gemfile.lock
··· 46 46 minitest (5.25.5) 47 47 mustermann (3.0.4) 48 48 ruby2_keywords (~> 0.0.1) 49 + nio4r (2.7.4) 49 50 pg (1.6.1) 50 51 pg (1.6.1-aarch64-linux) 51 52 pg (1.6.1-aarch64-linux-musl) ··· 59 60 psych (5.2.6) 60 61 date 61 62 stringio 63 + puma (6.6.1) 64 + nio4r (~> 2.0) 62 65 rack (3.2.0) 63 66 rack-protection (4.1.1) 64 67 base64 (>= 0.1.0) ··· 67 70 rack-session (2.1.1) 68 71 base64 (>= 0.1.0) 69 72 rack (>= 3.0.0) 73 + rackup (2.2.1) 74 + rack (>= 3) 70 75 rainbow (3.1.1) 71 76 rake (13.3.0) 72 77 rdoc (6.14.2) ··· 107 112 irb 108 113 minisky (~> 0.5) 109 114 pg 115 + puma 116 + rackup 110 117 rainbow 111 118 rake 119 + sinatra 112 120 sinatra-activerecord (~> 2.0) 113 121 114 122 BUNDLED WITH
+4
app/models/post.rb
··· 11 11 validates_length_of :data, maximum: 10000 12 12 13 13 belongs_to :user 14 + 15 + def at_uri 16 + "at://#{user.did}/app.bsky.feed.post/#{rkey}" 17 + end 14 18 end
+44
app/server.rb
··· 1 + require 'json' 2 + require 'sinatra/base' 3 + 4 + require_relative 'init' 5 + require_relative 'models/like' 6 + require_relative 'models/user' 7 + 8 + class Server < Sinatra::Application 9 + register Sinatra::ActiveRecordExtension 10 + set :port, 3000 11 + 12 + PAGE_LIMIT = 5 13 + 14 + helpers do 15 + def json_response(data) 16 + content_type :json 17 + JSON.generate(data) 18 + end 19 + 20 + def json_error(name, message, status: 400) 21 + content_type :json 22 + [status, JSON.generate({ error: name, message: message })] 23 + end 24 + end 25 + 26 + get '/xrpc/blue.feeds.lycan.searchPosts' do 27 + headers['access-control-allow-origin'] = '*' 28 + 29 + if settings.development? 30 + user = User.find_by(did: params[:user]) 31 + return json_error('UserNotFound', 'Missing "user" parameter') if user.nil? 32 + end 33 + 34 + if params[:query] 35 + query = params[:query].gsub('%', "\\%") 36 + likes = user.likes.joins(:post).includes(:post => :user).where("text ILIKE ?", "%#{query}%").order('likes.time DESC').limit(PAGE_LIMIT) 37 + post_uris = likes.map(&:post).map(&:at_uri) 38 + 39 + json_response(posts: post_uris) 40 + else 41 + json_error('MissingParameter', 'Missing "query" parameter') 42 + end 43 + end 44 + end
+8
bin/server
··· 1 + #!/usr/bin/env ruby 2 + 3 + $LOAD_PATH.unshift(File.expand_path('..', __dir__)) 4 + 5 + require 'bundler/setup' 6 + require 'app/server' 7 + 8 + Server.run!