package Ġm oto . d tp . info . backend . security Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Properties Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġkotlinx . coroutines . reactive . await First Ċ import Ġkotlinx . coroutines . reactive . await First OrNull Ċ import Ġm oto . d tp . info . backend . configuration . M oto D tp Configuration Ċ import Ġm oto . d tp . info . backend . domain . user . Auth Ċ import Ġm oto . d tp . info . backend . domain . user . Auth Type Ċ import Ġm oto . d tp . info . backend . domain . user . User Ċ import Ġm oto . d tp . info . backend . domain . user . Vk User Ċ import Ġm oto . d tp . info . backend . repository . Auth Repository Ċ import Ġm oto . d tp . info . backend . repository . UserRepository Ċ import Ġm oto . d tp . info . backend . rest . request . Auth Request Ċ import Ġm oto . d tp . info . backend . utils . Throw Utils . throw Internal Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . boot . context . properties . Constructor Binding Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . client . Rest Template Ċ Ċ @ Service Ċ class ĠVk Authorization ( ĊĠĠĠ Ġprivate Ġval Ġauth Repository : ĠAuth Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĠĠĠ Ġm oto D tp Configuration : ĠM oto D tp Configuration Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĠĠĠ Ġprivate Ġval Ġvk Ġ= Ġm oto D tp Configuration . vk ĊĠĠĠ Ġprivate Ġval Ġrest Template Ġ= ĠRest Template () ĊĊĠĠĠ Ġprivate Ġval Ġtoken Url Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ vk . token Url }? client _ id =${ vk . appId }& client _ secret =${ vk . secret }& redirect _ uri =${ vk . redirect Url }& code ={ code }" ĊĠĠĠ Ġprivate Ġval Ġdata Url Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ vk . data Url }? access _ token ={ token }& user _ ids ={ user }& v =${ vk . apiVersion }" ĊĊĠĠĠ Ġsuspend Ġfun Ġauthorize ( auth Request : ĠAuth Request . VK ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvk User Ġ= Ġretrieve Vk User ( auth Request . code ) ĊĠĠĠĠĠĠĠ Ġval Ġauth Ġ= Ġauth Repository . findBy Vk Id ( vk User . id ). await First OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( auth Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġuser Repository . findById ( auth . uid ). await First () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser Repository . save ( User ( nick Ġ= Ġvk User . nick )). await First () ĊĠĠĠĠĠĠĠ Ġauth Repository . save ( Auth ( uid Ġ= Ġuser . id !! , Ġtype Ġ= ĠAuth Type . VK , Ġvk Ġ= Ġvk User )). await First () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġuser ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġretrieve Vk User ( code : ĠString ): ĠVk User Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġrest Template . get For Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk Token Response :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow Internal (" NULL Ġresult Ġfor ĠVK Ġaccess Ġtoken ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Ġ= Ġrest Template . get For Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVk UserData Response :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . userId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. response Ġ?: Ġthrow Internal (" NULL Ġresult Ġfor ĠVK Ġuser Ġinfo ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( userInfo . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Internal (" NULL Ġresult Ġfor ĠVK Ġuser Ġinfo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnick Ġ= ĠlistOf NotNull ( userInfo [ 0 ]. lastName , ĠuserInfo [ 0 ]. lastName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Blank Ġ{ ĠaccessToken . userId . toString () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVk User ( nick , ĠaccessToken . userId ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Constructor Binding ĊĠĠĠ Ġ@ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠVk Token Response ( ĊĠĠĠĠĠĠĠ Ġ@ JsonProperty ( value Ġ= Ġ" access _ token ") Ġval Ġtoken : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ JsonProperty ( value Ġ= Ġ" user _ id ") Ġval ĠuserId : ĠInt ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Constructor Binding ĊĠĠĠ Ġ@ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠVk UserData Response ( ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠList < UserData > ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġ{" error ":{" error _ code ": 8 ," error _ msg ":" Invalid Ġrequest : Ġversions Ġbelow Ġ 5 . 2 1 Ġare Ġdeprecated . ĠVersion Ġparam Ġshould Ġbe Ġpassed Ġas Ġ\" v \" . Ġ\" version \" Ġparam Ġis Ġinvalid Ġand Ġnot Ġsupported . ĠFor Ġmore Ġinformation Ġgo Ġto Ġhttps :\/\/ vk . com \/ dev \/ constant _ version _ updates "," request _ params ":[{" key ":" user _ ids "," value ":" 8 4 3 1 7 9 5 4 "},{" key ":" v "," value ":" 5 . 1 3 "},{" key ":" method "," value ":" users . get "},{" key ":" oauth "," value ":" 1 "} ]}} ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Constructor Binding ĊĠĠĠĠĠĠĠ Ġ@ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠUser Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty ( value Ġ= Ġ" first _ name ") Ġval ĠfirstName : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty ( value Ġ= Ġ" last _ name ") Ġval ĠlastName : ĠString ?, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }