1 2 3 4 5 6 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
# frozen_string_literal: true
module ActivityPub
module Projects
class ReleasesController < ApplicationController
feature_category :release_orchestration
before_action :enforce_payload, only: :inbox
def index
opts = {
inbox: inbox_project_releases_url(@project),
outbox: outbox_project_releases_url(@project)
}
render json: ActivityPub::ReleasesActorSerializer.new.represent(@project, opts)
end
def inbox
service = inbox_service
success = service ? service.execute : true
response = { success: success }
response[:errors] = service.errors unless success
render json: response
end
def outbox
serializer = ActivityPub::ReleasesOutboxSerializer.new.with_pagination(request, response)
render json: serializer.represent(releases)
end
private
def releases(params = {})
ReleasesFinder.new(@project, current_user, params).execute
end
def enforce_payload
return if payload
head :unprocessable_entity
false
end
def payload
@payload ||= begin
Gitlab::Json.parse(request.body.read)
rescue JSON::ParserError
nil
end
end
def follow?
payload['type'] == 'Follow'
end
def unfollow?
undo = payload['type'] == 'Undo'
object = payload['object']
follow = object.present? && object.is_a?(Hash) && object['type'] == 'Follow'
undo && follow
end
def inbox_service
return ReleasesFollowService.new(project, payload) if follow?
return ReleasesUnfollowService.new(project, payload) if unfollow?
nil
end
end
end
end
|