debian-mirror-gitlab/app/services/issues/zoom_link_service.rb

106 lines
2.7 KiB
Ruby
Raw Normal View History

2019-12-04 20:38:33 +05:30
# frozen_string_literal: true
module Issues
class ZoomLinkService < Issues::BaseService
def initialize(issue, user)
super(issue.project, user)
@issue = issue
2019-12-26 22:10:19 +05:30
@added_meeting = ZoomMeeting.canonical_meeting(@issue)
2019-12-04 20:38:33 +05:30
end
def add_link(link)
if can_add_link? && (link = parse_link(link))
2019-12-26 22:10:19 +05:30
begin
add_zoom_meeting(link)
rescue ActiveRecord::RecordNotUnique
2020-01-01 13:55:28 +05:30
error(message: _('Failed to add a Zoom meeting'))
2019-12-26 22:10:19 +05:30
end
2019-12-04 20:38:33 +05:30
else
2020-01-01 13:55:28 +05:30
error(message: _('Failed to add a Zoom meeting'))
2019-12-04 20:38:33 +05:30
end
end
def remove_link
if can_remove_link?
2019-12-26 22:10:19 +05:30
remove_zoom_meeting
2020-01-01 13:55:28 +05:30
success(message: _('Zoom meeting removed'))
2019-12-04 20:38:33 +05:30
else
2020-01-01 13:55:28 +05:30
error(message: _('Failed to remove a Zoom meeting'))
2019-12-04 20:38:33 +05:30
end
end
2019-12-26 22:10:19 +05:30
def can_add_link?
2020-01-01 13:55:28 +05:30
can_change_link? && !@added_meeting
2019-12-26 22:10:19 +05:30
end
2019-12-04 20:38:33 +05:30
def can_remove_link?
2020-01-01 13:55:28 +05:30
can_change_link? && @issue.persisted? && !!@added_meeting
2019-12-04 20:38:33 +05:30
end
def parse_link(link)
Gitlab::ZoomLinkExtractor.new(link).links.last
end
private
attr_reader :issue
2019-12-21 20:55:43 +05:30
def track_meeting_added_event
::Gitlab::Tracking.event('IncidentManagement::ZoomIntegration', 'add_zoom_meeting', label: 'Issue ID', value: issue.id)
end
def track_meeting_removed_event
::Gitlab::Tracking.event('IncidentManagement::ZoomIntegration', 'remove_zoom_meeting', label: 'Issue ID', value: issue.id)
end
2019-12-26 22:10:19 +05:30
def add_zoom_meeting(link)
2020-01-01 13:55:28 +05:30
zoom_meeting = new_zoom_meeting(link)
response =
if @issue.persisted?
# Save the meeting directly since we only want to update one meeting, not all
zoom_meeting.save
success(message: _('Zoom meeting added'))
else
success(message: _('Zoom meeting added'), payload: { zoom_meetings: [zoom_meeting] })
end
track_meeting_added_event
SystemNoteService.zoom_link_added(@issue, @project, current_user)
response
end
def new_zoom_meeting(link)
ZoomMeeting.new(
2019-12-26 22:10:19 +05:30
issue: @issue,
2020-01-01 13:55:28 +05:30
project: @project,
2019-12-26 22:10:19 +05:30
issue_status: :added,
url: link
)
2019-12-04 20:38:33 +05:30
end
2019-12-26 22:10:19 +05:30
def remove_zoom_meeting
@added_meeting.update(issue_status: :removed)
track_meeting_removed_event
SystemNoteService.zoom_link_removed(@issue, @project, current_user)
2019-12-04 20:38:33 +05:30
end
2020-01-01 13:55:28 +05:30
def success(message:, payload: nil)
ServiceResponse.success(message: message, payload: payload)
2019-12-04 20:38:33 +05:30
end
2020-01-01 13:55:28 +05:30
def error(message:)
2019-12-26 22:10:19 +05:30
ServiceResponse.error(message: message)
2019-12-04 20:38:33 +05:30
end
2020-01-01 13:55:28 +05:30
def can_change_link?
if @issue.persisted?
can?(current_user, :update_issue, @project)
else
can?(current_user, :create_issue, @project)
end
2019-12-04 20:38:33 +05:30
end
end
end