module_api.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package modules
  2. import (
  3. "html"
  4. "net/http"
  5. "time"
  6. "golang-fave/assets"
  7. // "golang-fave/consts"
  8. // "golang-fave/engine/builder"
  9. "golang-fave/engine/fetdata"
  10. "golang-fave/engine/wrapper"
  11. "golang-fave/utils"
  12. )
  13. func (this *Modules) api_GenerateXmlCurrencies(wrap *wrapper.Wrapper) string {
  14. result := ``
  15. rows, err := wrap.DB.Query(
  16. `SELECT
  17. code,
  18. coefficient
  19. FROM
  20. shop_currencies
  21. ORDER BY
  22. id ASC
  23. ;`,
  24. )
  25. if err == nil {
  26. defer rows.Close()
  27. values := make([]string, 2)
  28. scan := make([]interface{}, len(values))
  29. for i := range values {
  30. scan[i] = &values[i]
  31. }
  32. for rows.Next() {
  33. err = rows.Scan(scan...)
  34. if err == nil {
  35. result += `<currency id="` + html.EscapeString(string(values[0])) + `" rate="` + html.EscapeString(string(values[1])) + `"/>`
  36. }
  37. }
  38. }
  39. return result
  40. }
  41. func (this *Modules) api_GenerateXmlCategories(wrap *wrapper.Wrapper) string {
  42. result := ``
  43. rows, err := wrap.DB.Query(
  44. `SELECT
  45. data.id,
  46. data.user,
  47. data.name,
  48. data.alias,
  49. data.lft,
  50. data.rgt,
  51. MAX(data.parent_id) AS parent_id
  52. FROM
  53. (
  54. SELECT
  55. node.id,
  56. node.user,
  57. node.name,
  58. node.alias,
  59. node.lft,
  60. node.rgt,
  61. parent.id AS parent_id
  62. FROM
  63. shop_cats AS node,
  64. shop_cats AS parent
  65. WHERE
  66. node.lft BETWEEN parent.lft AND parent.rgt AND
  67. node.id > 1
  68. ORDER BY
  69. node.lft ASC
  70. ) AS data
  71. WHERE
  72. data.id <> data.parent_id
  73. GROUP BY
  74. data.id
  75. ORDER BY
  76. data.lft ASC
  77. ;`,
  78. )
  79. if err == nil {
  80. defer rows.Close()
  81. values := make([]string, 7)
  82. scan := make([]interface{}, len(values))
  83. for i := range values {
  84. scan[i] = &values[i]
  85. }
  86. for rows.Next() {
  87. err = rows.Scan(scan...)
  88. if err == nil {
  89. if utils.StrToInt(string(values[6])) > 1 {
  90. result += `<category id="` + html.EscapeString(string(values[0])) + `" parentId="` + html.EscapeString(string(values[6])) + `">` + html.EscapeString(string(values[2])) + `</category>`
  91. } else {
  92. result += `<category id="` + html.EscapeString(string(values[0])) + `">` + html.EscapeString(string(values[2])) + `</category>`
  93. }
  94. }
  95. }
  96. }
  97. return result
  98. }
  99. func (this *Modules) api_GenerateXmlOffers(wrap *wrapper.Wrapper) string {
  100. /*
  101. <offer id="19305" available="true">
  102. <url>http://abc.ua/catalog/muzhskaya_odezhda/kurtki/kurtkabx.html</url>
  103. <price>4499</price>
  104. <currencyId>UAH</currencyId>
  105. <categoryId>391</categoryId>
  106. <picture>http://abc.ua/upload/iblock/a53/a5391cddb40be91705.jpg</picture>
  107. <picture>http://abc.ua/upload/iblock/9d0/9d06805d219fb525fc.jpg</picture>
  108. <picture>http://abc.ua/upload/iblock/93d/93de38537e1cc1f8f2.jpg</picture>
  109. <vendor>Abc clothes</vendor>
  110. <stock_quantity>100</stock_quantity>
  111. <name>Куртка Abc clothes Scoperandom-HH XL Черная (1323280942900)</name>
  112. <description><![CDATA[<p>Одежда<b>Abc clothes</b> способствует развитию функций головного мозга за счет поощрения мелкой моторики.</p><p>В Abc <b>New Collection</b> будет особенно удобно лазать, прыгать, бегать.</p><p>За счет своей универсальноcти и многофункциональности, <b>Abc clothes</b> отлично подходит:</p><ul><li><b>Для весны</b></li><li><b>Для лета</b></li><li><b>Для ранней осени</b> </li></ul><br><p><b>Состав:</b><br>• 92% полиэстер, 8% эластан, нетоксичность подтверждена лабораторно.</p><p><b>Вес:</b> 305 г</p>]]></description>
  113. <param name="Вид">Куртка</param>
  114. <param name="Размер">XL</param>
  115. <param name="Сезон">Весна-Осень</param>
  116. <param name="Категория">Мужская</param>
  117. <param name="Цвет">Черный</param>
  118. <param name="Длина">Средней длины</param>
  119. <param name="Стиль">Повседневный (casual)</param>
  120. <param name="Особенности">Модель с капюшоном</param>
  121. <param name="Состав">92% полиэстер, 8% эластан</param>
  122. <param name="Артикул">58265468</param>
  123. </offer>
  124. */
  125. return ``
  126. }
  127. func (this *Modules) api_GenerateXml(wrap *wrapper.Wrapper) string {
  128. return `<?xml version="1.0" encoding="UTF-8"?>
  129. <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
  130. <yml_catalog date="` + time.Unix(int64(time.Now().Unix()), 0).Format("2006-01-02 15:04") + `">
  131. <shop>
  132. <name>` + html.EscapeString((*wrap.Config).API.XML.Name) + `</name>
  133. <company>` + html.EscapeString((*wrap.Config).API.XML.Company) + `</company>
  134. <url>` + html.EscapeString((*wrap.Config).API.XML.Url) + `</url>
  135. <currencies>` + this.api_GenerateXmlCurrencies(wrap) + `</currencies>
  136. <categories>` + this.api_GenerateXmlCategories(wrap) + `</categories>
  137. <offers>` + this.api_GenerateXmlOffers(wrap) + `</offers>
  138. </shop>
  139. </yml_catalog>`
  140. }
  141. func (this *Modules) RegisterModule_Api() *Module {
  142. return this.newModule(MInfo{
  143. WantDB: true,
  144. Mount: "api",
  145. Name: "Api",
  146. Order: 803,
  147. System: true,
  148. Icon: assets.SysSvgIconPage,
  149. Sub: &[]MISub{},
  150. }, func(wrap *wrapper.Wrapper) {
  151. if (*wrap.Config).API.XML.Enabled == 1 {
  152. if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "api" && wrap.UrlArgs[1] == "products" {
  153. // Fix url
  154. if wrap.R.URL.Path[len(wrap.R.URL.Path)-1] != '/' {
  155. http.Redirect(wrap.W, wrap.R, wrap.R.URL.Path+"/"+utils.ExtractGetParams(wrap.R.RequestURI), 301)
  156. return
  157. }
  158. // XML
  159. wrap.W.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  160. wrap.W.Header().Set("Content-Type", "text/xml; charset=utf-8")
  161. wrap.W.WriteHeader(http.StatusOK)
  162. wrap.W.Write([]byte(this.api_GenerateXml(wrap)))
  163. } else if len(wrap.UrlArgs) == 1 {
  164. // Fix url
  165. if wrap.R.URL.Path[len(wrap.R.URL.Path)-1] != '/' {
  166. http.Redirect(wrap.W, wrap.R, wrap.R.URL.Path+"/"+utils.ExtractGetParams(wrap.R.RequestURI), 301)
  167. return
  168. }
  169. // Some info
  170. wrap.W.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  171. wrap.W.WriteHeader(http.StatusOK)
  172. wrap.W.Write([]byte("Fave engine API mount point!"))
  173. } else {
  174. // User error 404 page
  175. wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
  176. return
  177. }
  178. } else {
  179. // User error 404 page
  180. wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
  181. return
  182. }
  183. }, func(wrap *wrapper.Wrapper) (string, string, string) {
  184. // No any page for back-end
  185. return "", "", ""
  186. })
  187. }