| 1 | module Api |
| 2 | module V1 |
| 3 | class KaraokeController < ApiController |
| 4 | before_action :validate_request |
| 5 | |
| 6 | def lyric_synches |
| 7 | render_file |
| 8 | end |
| 9 | |
| 10 | def lyric_synches_post |
| 11 | return unless valid_payload? |
| 12 | |
| 13 | @payload.map do |lyric_synch| |
| 14 | lyric_synch.delete('id') |
| 15 | lyric_synch['audio_file_id'] = params[:audio_file_id] |
| 16 | lyric_synch['user_id'] = current_user.id |
| 17 | end |
| 18 | |
| 19 | LyricSynch.insert_all(@payload) |
| 20 | render_file |
| 21 | end |
| 22 | |
| 23 | def lyric_synches_put |
| 24 | return unless valid_payload? |
| 25 | |
| 26 | LyricSynch.upsert_all(@payload, unique_by: :id) |
| 27 | render_file |
| 28 | end |
| 29 | |
| 30 | private |
| 31 | |
| 32 | def validate_request |
| 33 | return render_error 'You must login.' unless user_signed_in? |
| 34 | |
| 35 | return render_error 'We need the id.' if params[:audio_file_id].nil? |
| 36 | |
| 37 | begin |
| 38 | @audio_file_id = Integer(params[:audio_file_id]) |
| 39 | rescue ArgumentError |
| 40 | return render_error 'audio_file_id should be integer.' |
| 41 | end |
| 42 | |
| 43 | true |
| 44 | end |
| 45 | |
| 46 | def valid_payload? |
| 47 | information = request.raw_post |
| 48 | data_parsed = JSON.parse(information) |
| 49 | @payload = data_parsed['payload'] |
| 50 | if @payload.nil? |
| 51 | render_error 'We need the payload.' |
| 52 | return false |
| 53 | end |
| 54 | |
| 55 | true |
| 56 | end |
| 57 | |
| 58 | def render_error(message) |
| 59 | render json: { |
| 60 | code: 500, |
| 61 | message: message, |
| 62 | audio_files: [] |
| 63 | } |
| 64 | end |
| 65 | |
| 66 | def render_file |
| 67 | @lyric_synches = LyricSynch.where(audio_file_id: @audio_file_id) |
| 68 | render json: { |
| 69 | code: 200, |
| 70 | message: 'OK.', |
| 71 | lyric_synches: @lyric_synches.as_json(only: %i[id lyric time]) |
| 72 | } |
| 73 | end |
| 74 | end |
| 75 | end |
| 76 | end |