package Ġcom . ak ot k owski . simple data warehouse . ath ena Ċ Ċ import Ġcom . ak ot k owski . simple data warehouse . dto . Query DTO Ċ import Ġorg . springframework . stereotype . Service Ċ Ċ @ Service Ċ class ĠQuery Mapper () Ġ{ ĊĠĠĠ Ġfun Ġto Query ( query : ĠQuery DTO ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Query ( query ) ĊĠĠĠĠĠĠĠ Ġvar Ġselect Rows Ġ= Ġquery . select . join ToString () ĊĠĠĠĠĠĠĠ Ġval ĠtableName Ġ= Ġ"\" simple _ data _ warehouse \" .\" campaign s _ view \"" ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġuse Ġstring Ġbuilder Ġfor Ġbetter Ġperformance ĊĠĠĠĠĠĠĠ Ġvar Ġsql Ġ= Ġ" select Ġ$ select Rows Ġfrom Ġ$ tableName " ĊĠĠĠĠĠĠĠ Ġquery . where ?. let Ġ{ Ġsql Ġ+= Ġ" Ġwhere Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġquery . groupBy ?. let Ġ{ Ġsql Ġ+= Ġ" Ġgroup Ġby Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġquery . having ?. let Ġ{ Ġsql Ġ+= Ġ" Ġhaving Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġquery . orderBy ?. let Ġ{ Ġsql Ġ+= Ġ" Ġorder Ġby Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġsql Ġ+= Ġ" Ġlimit Ġ" Ġ+ Ġquery . limit ĊĠĠĠĠĠĠĠ Ġreturn Ġsql ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFIXME : Ġqueries Ġshould Ġbe Ġmore Ġrestricted Ġto Ġavoid Ġab use Ġusage ĊĠĠĠ Ġprivate Ġfun Ġvalidate Query ( query : ĠQuery DTO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . select . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck No Sql Injection ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġquery . orderBy ?. let Ġ{ Ġcheck No Sql Injection ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġquery . where ?. let Ġ{ Ġcheck No Sql Injection ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġquery . groupBy ?. let Ġ{ Ġcheck No Sql Injection ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġquery . limit . take If Ġ{ Ġi Ġ-> Ġi Ġ> Ġ 1 0 0 Ġ} ?. run Ġ{ Ġthrow ĠQuery ValidationException (" Query Ġlimit Ġto Ġhigh , Ġmax Ġis Ġ 1 0 0 ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck No Sql Injection ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query . contains ("-- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġquery . contains (" /* ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ! query . matches ("[ \\ s \\ (\\ )\\ w \\ | \\ & \\/ \\ - \\ * \\ + \\ ' \\ ! >< = ]* ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠQuery ValidationException (" Invalid Ġquery ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠQuery ValidationException ( override Ġval Ġmessage : ĠString ) Ġ: ĠException ()