package Ġcom . github . fn une z kan ut . service Ċ Ċ import Ġcom . github . fn une z kan ut . config . ApiError Ċ import Ġcom . github . fn une z kan ut . model . Student Ċ import Ġcom . github . fn une z kan ut . repository . Students Postgres Repo Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . springframework . stereotype . Service Ċ Ċ @ Service Ċ class ĠStudent s Service ( ĊĠĠĠ Ġprivate Ġval Ġstudents Repo : ĠStudent s Postgres Repo Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ// valid ates Ġuser Ġprovided Ġvalues , Ġ 4 xx Ġapi Ġerrors Ġif Ġsomething Ġnot Ġright ĊĠĠĠ Ġfun Ġvalidate ( un validated : ĠStudent ): ĠStudent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStudent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġcheck Code ( un validated . code ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġcheck Name ( un validated . firstName ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlastName Ġ= Ġcheck Name ( un validated . lastName ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// creates Ġa Ġstudent , Ġreturns Ġcreated Ġstudent ĊĠĠĠ Ġfun Ġcreate ( validated : ĠStudent ): ĠStudent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" adding Ġcourse Ġto ĠDB : Ġ$ validated " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstudents Repo . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstudent Ġ= Ġvalidated ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠApi Error ( 5 0 0 , Ġ" Failed Ġto Ġcreate Ġa Ġnew Ġstudent ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// double Ġcheck Ġprovided Ġcode Ġvalue Ġfrom Ġuser Ġinput ĊĠĠĠ Ġfun Ġcheck Code (_ code : ĠString ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ_ code . toUpperCase (). trim () ĊĠĠĠĠĠĠĠ Ġif Ġ(! code . matches ( Regex ("[ 0 - 9 ]{ 8 } "))) Ġ{ Ġ Ġ// students Ġhave Ġan Ġ 8 Ġdigit Ġunique Ġcode Ġlike Ġ 0 0 3 3 4 4 5 6 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠApi Error ( 4 0 0 , Ġ" Invalid Ġstudent Ġcode Ġprovided ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// double Ġcheck Ġexist ance Ġof Ġthe Ġcourse Ġas Ġcode Ġis Ġunique ĊĠĠĠĠĠĠĠ Ġif Ġ( students Repo . fetch By Code ( code Ġ= Ġcode ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠApi Error ( 4 0 9 , Ġ" A Ġstudent Ġwith Ġthis Ġstudent Ġcode Ġalready Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// double Ġcheck Ġprovided Ġname Ġvalue Ġfrom Ġuser Ġinput ĊĠĠĠ Ġfun Ġcheck Name (_ name : ĠString ): ĠString Ġ= Ġ_ name . trim () ĊĊĠĠĠ Ġ// retrieve Ġa Ġsingle Ġstudent Ġusing Ġits Ġmain Ġidentifier ĊĠĠĠ Ġfun Ġfetch ( uid : ĠString ): ĠStudent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstudents Repo . fetch ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuid Ġ= Ġuid ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠApi Error ( 4 0 4 , Ġ" No Ġsuch Ġstudent : Ġ$ uid ") ĊĠĠĠ Ġ} Ċ }