package Ġcom . netflix . spin n aker . ke el . slack . handlers Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . convert Value Ċ import Ġcom . netflix . spin n aker . ke el . api . Sc m Info Ċ import Ġcom . netflix . spin n aker . ke el . api . artifacts . Published Artifact Ċ import Ġcom . netflix . spin n aker . ke el . api . constraints . Constraint Status Ċ import Ġcom . netflix . spin n aker . ke el . artifacts . generate Compare Link Ċ import Ġcom . netflix . spin n aker . ke el . constraints . Manual J udge ment Constraint Attributes Ċ import Ġcom . netflix . spin n aker . ke el . constraints . Original Slack Message Detail Ċ import Ġcom . netflix . spin n aker . ke el . notifications . Notification Type . MAN UAL _ J UD G MENT _ AW A IT Ċ import Ġcom . netflix . spin n aker . ke el . persistence . Ke el Repository Ċ import Ġcom . netflix . spin n aker . ke el . slack . Slack Manual J ud gment Notification Ċ import Ġcom . netflix . spin n aker . ke el . slack . Slack Service Ċ import Ġcom . slack . api . methods . response . chat . Chat Post Message Response Ċ import Ġcom . slack . api . model . block . Layout Block Ċ import Ġcom . slack . api . model . kotlin _ extension . block . with Blocks Ċ import Ġorg . apache . logging . log 4 j . util . Strings Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ /** Ċ Ġ* ĠSends Ġnotification Ġwhen Ġmanual Ġjud gment Ġis Ġawait ing Ċ Ġ*/ Ċ @ Component Ċ class ĠManual J ud gment Notification Handler ( ĊĠ Ġprivate Ġval Ġslack Service : ĠSlack Service , ĊĠ Ġprivate Ġval Ġgit Data Generator : ĠGit Data Generator , ĊĠ Ġprivate Ġval Ġsc m Info : ĠS cm Info , ĊĠ Ġprivate Ġval Ġrepository : ĠKe el Repository , Ċ ) Ġ: ĠSlack Notification Handler < Slack Manual J ud gment Notification > Ġ{ ĊĠ Ġoverride Ġval Ġsupported Types Ġ= ĠlistOf ( MAN UAL _ J UD G MENT _ AW A IT ) ĊĠ Ġprivate Ġval Ġlog Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger ( java Class ) Ġ} ĊĊĠ Ġoverride Ġfun ĠsendMessage ( notification : ĠSlack Manual J ud gment Notification , Ġchannel : ĠString ) Ġ{ ĊĠĠĠ Ġlog . debug (" Sending Ġmanual Ġjud gment Ġawait Ġnotification Ġfor Ġapplication Ġ${ notification . application }") ĊĊĠĠĠ Ġwith ( notification ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcompare Link Ġ= Ġgenerate Compare Link ( scm Info , Ġartifact Candidate , Ġcurrent Artifact , Ġdelivery Artifact ) ĊĠĠĠĠĠ Ġval Ġheader Text Ġ= Ġ" Await ing Ġmanual Ġjudge ment " ĊĠĠĠĠĠ Ġval ĠimageUrl Ġ= Ġ" https :// raw . githubusercontent . com / spin n aker / spin n aker . github . io / master / assets / images / md _ icons / mj _ needed . png " ĊĠĠĠĠĠ Ġval Ġbase Blocks Ġ= Ġconstruct Message Without Buttons ( ĊĠĠĠĠĠĠĠ Ġnotification . target Environment , ĊĠĠĠĠĠĠĠ Ġnotification . application , ĊĠĠĠĠĠĠĠ Ġnotification . artifact Candidate , ĊĠĠĠĠĠĠĠ Ġnotification . pinned Artifact , ĊĠĠĠĠĠĠĠ Ġheader Text , ĊĠĠĠĠĠĠĠ ĠimageUrl , ĊĠĠĠĠĠĠĠ Ġ" mj _ needed ", ĊĠĠĠĠĠĠĠ Ġgit Data Generator ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġaction Blocks Ġ= Ġwith Blocks Ġ{ ĊĠĠĠĠĠĠĠ Ġactions Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġelements Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext (" Approve ", Ġemoji Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle (" primary ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ( Constraint Status . OVERRIDE _ PASS . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Id ("${ state Uid . toString ()} :${ Constraint Status . OVERRIDE _ PASS . name }: MAN UAL _ J UD G MENT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm (" Do Ġit !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeny (" Stop , ĠI 've Ġchanged Ġmy Ġmind !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle (" Are Ġyou Ġsure ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarkdown Text (" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġpromote Ġversion Ġ${ artifact Candidate . version }? ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext (" Reject ", Ġemoji Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle (" danger ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ( Constraint Status . OVERRIDE _ FAIL . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Id ("${ state Uid . toString ()} :${ Constraint Status . OVERRIDE _ FAIL . name }: MAN UAL _ J UD G MENT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarkdown Text (" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġreject Ġversion Ġ${ artifact Candidate . version }? ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm (" Do Ġit !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeny (" Stop , ĠI 've Ġchanged Ġmy Ġmind !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle (" Are Ġyou Ġsure ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compare Link Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext (" See Ġchanges ", Ġemoji Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl ( compare Link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaction Ġid Ġwill Ġbe Ġcons isted Ġby Ġ 3 Ġsections Ġwith Ġ":" Ġbetween Ġthem Ġto Ġkeep Ġit Ġconsistent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Id (" button : url : diff ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġresponse : ĠChat Post Message Response ? Ġ= Ġslack Service ĊĠĠĠĠĠĠĠ Ġ. send Slack Notification ( channel , Ġbase Blocks Ġ+ Ġaction Blocks , Ġapplication Ġ= Ġapplication , Ġtype Ġ= Ġsupported Types , Ġfallback Text Ġ= Ġheader Text ) ĊĊĠĠĠĠĠ Ġif Ġ( response ?. is Ok Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġsome Ġof Ġthe Ġresponse Ġif Ġwe Ġhave Ġa Ġconstraint Ġuid ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġthat Ġwe Ġcan Ġupdate Ġthe Ġmessage Ġif Ġclicked Ġfrom Ġthe ĠUI ĊĠĠĠĠĠĠĠ Ġstore Message Details ( response , Ġnotification ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġmost Ġof Ġthe Ġnotification Ġin Ġa Ġway Ġthat Ġcan Ġbe Ġre - used Ġacross Ġhandles ĊĠĠĠĠ Ġ* Ġso Ġthat Ġwe Ġcan Ġupdate Ġthe Ġnotification Ġif Ġa Ġjudge ment Ġis Ġapproved Ġfrom Ġthe Ġapi ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconstruct Message Without Buttons ( ĊĠĠĠĠĠ Ġenvironment : ĠString , ĊĠĠĠĠĠ Ġapplication : ĠString , ĊĠĠĠĠĠ Ġartifact Candidate : ĠPub lished Artifact , ĊĠĠĠĠĠ Ġpinned Artifact : ĠPub lished Artifact ?, ĊĠĠĠĠĠ Ġheader Text : ĠString , ĊĠĠĠĠĠ ĠimageUrl : ĠString , ĊĠĠĠĠĠ Ġimage Alt Text : ĠString , ĊĠĠĠĠĠ Ġgit Data Generator : ĠGit Data Generator ĊĠĠĠ Ġ): ĠList < Layout Block > Ġ{ ĊĠĠĠĠĠ Ġval Ġenv Ġ= ĠStrings . to Root UpperCase ( environment ) ĊĠĠĠĠĠ Ġreturn Ġwith Blocks Ġ{ ĊĠĠĠĠĠĠĠ Ġheader Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtext ( header Text , Ġemoji Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġgit Data Generator . generate Commit Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Candidate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Alt Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv Ġ= Ġenv ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgit Metadata Ġ= Ġartifact Candidate . git Metadata ĊĠĠĠĠĠĠĠ Ġif Ġ( git Metadata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġgit Data Generator . condition ally Add Full Commit Msg Button ( this , Ġgit Metadata ) ĊĠĠĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgit Data Generator . generate Sc m Info ( this , Ġapplication , Ġgit Metadata , Ġartifact Candidate ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġwarning Ġsection Ġin Ġcase Ġthere 's Ġa Ġpinned Ġartifact ĊĠĠĠĠĠĠĠ Ġif Ġ( pinned Artifact Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarkdown Text (": warning : ĠAnother Ġversion Ġis Ġpinned Ġhere . ĠYou Ġwill Ġneed Ġto Ġun pin Ġit Ġfirst Ġto Ġpromote Ġthis Ġversion .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccess ory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext (" See Ġpinned Ġversion ", Ġemoji Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Id (" button : url : pinned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl ( git Data Generator . generate Artifact Url ( application , Ġpinned Artifact . reference , Ġpinned Artifact . version )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠStores Ġthe Ġmessage Ġdetails Ġin Ġthe Ġconstraint Ġstate Ġrepository Ġso Ġthat Ġthey Ġcan Ġbe Ġused ĊĠĠ Ġ* Ġto Ġupdate Ġthe Ġslack Ġmessage . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġstore Message Details ( response : ĠChat Post Message Response , Ġnotification : ĠSlack Manual J ud gment Notification ) Ġ{ ĊĠĠĠ Ġnotification . state Uid ?. let Ġ{ Ġuid Ġ-> ĊĠĠĠĠĠ Ġval Ġcurrent State Ġ= Ġrepository . get Constraint State ById ( uid ) ĊĠĠĠĠĠ Ġif Ġ( currentState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġslack Details Ġ= Ġ( currentState . attributes Ġas ? ĠManual J udge ment Constraint Attributes )?. slack Details Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġupdated Slack Details Ġ= Ġslack Details Ġ+ ĠOriginal Slack Message Detail ( ĊĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġresponse . ts , ĊĠĠĠĠĠĠĠĠĠ Ġchannel Ġ= Ġresponse . channel , ĊĠĠĠĠĠĠĠĠĠ Ġartifact Candidate Ġ= Ġnotification . artifact Candidate , ĊĠĠĠĠĠĠĠĠĠ Ġtarget Environment Ġ= Ġcurrent State . environment Name , ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Artifact Ġ= Ġnotification . current Artifact , ĊĠĠĠĠĠĠĠĠĠ Ġdelivery Artifact Ġ= Ġnotification . delivery Artifact , ĊĠĠĠĠĠĠĠĠĠ Ġpinned Artifact Ġ= Ġnotification . pinned Artifact , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated State Ġ= Ġcurrent State . copy ( ĊĠĠĠĠĠĠĠĠĠ Ġattributes Ġ= ĠManual J udge ment Constraint Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslack Details Ġ= Ġupdated Slack Details ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrepository . store Constraint State ( updated State ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ