File: releases_controller.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (74 lines) | stat: -rw-r--r-- 1,782 bytes parent folder | download
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