module_api.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. /*
  43. <category id="2">Женская одежда</category>
  44. <category id="261" parentId="2">Платья</category>
  45. <category id="3">Мужская одежда</category>
  46. <category id="391" parentId="3">Куртки</category>
  47. */
  48. return ``
  49. }
  50. func (this *Modules) api_GenerateXmlOffers(wrap *wrapper.Wrapper) string {
  51. /*
  52. <offer id="19305" available="true">
  53. <url>http://abc.ua/catalog/muzhskaya_odezhda/kurtki/kurtkabx.html</url>
  54. <price>4499</price>
  55. <currencyId>UAH</currencyId>
  56. <categoryId>391</categoryId>
  57. <picture>http://abc.ua/upload/iblock/a53/a5391cddb40be91705.jpg</picture>
  58. <picture>http://abc.ua/upload/iblock/9d0/9d06805d219fb525fc.jpg</picture>
  59. <picture>http://abc.ua/upload/iblock/93d/93de38537e1cc1f8f2.jpg</picture>
  60. <vendor>Abc clothes</vendor>
  61. <stock_quantity>100</stock_quantity>
  62. <name>Куртка Abc clothes Scoperandom-HH XL Черная (1323280942900)</name>
  63. <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>
  64. <param name="Вид">Куртка</param>
  65. <param name="Размер">XL</param>
  66. <param name="Сезон">Весна-Осень</param>
  67. <param name="Категория">Мужская</param>
  68. <param name="Цвет">Черный</param>
  69. <param name="Длина">Средней длины</param>
  70. <param name="Стиль">Повседневный (casual)</param>
  71. <param name="Особенности">Модель с капюшоном</param>
  72. <param name="Состав">92% полиэстер, 8% эластан</param>
  73. <param name="Артикул">58265468</param>
  74. </offer>
  75. */
  76. return ``
  77. }
  78. func (this *Modules) api_GenerateXml(wrap *wrapper.Wrapper) string {
  79. return `<?xml version="1.0" encoding="UTF-8"?>
  80. <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
  81. <yml_catalog date="` + time.Unix(int64(time.Now().Unix()), 0).Format("2006-01-02 15:04") + `">
  82. <shop>
  83. <name>` + html.EscapeString((*wrap.Config).API.XML.Name) + `</name>
  84. <company>` + html.EscapeString((*wrap.Config).API.XML.Company) + `</company>
  85. <url>` + html.EscapeString((*wrap.Config).API.XML.Url) + `</url>
  86. <currencies>` + this.api_GenerateXmlCurrencies(wrap) + `</currencies>
  87. <categories>` + this.api_GenerateXmlCategories(wrap) + `</categories>
  88. <offers>` + this.api_GenerateXmlOffers(wrap) + `</offers>
  89. </shop>
  90. </yml_catalog>`
  91. }
  92. func (this *Modules) RegisterModule_Api() *Module {
  93. return this.newModule(MInfo{
  94. WantDB: true,
  95. Mount: "api",
  96. Name: "Api",
  97. Order: 803,
  98. System: true,
  99. Icon: assets.SysSvgIconPage,
  100. Sub: &[]MISub{},
  101. }, func(wrap *wrapper.Wrapper) {
  102. if (*wrap.Config).API.XML.Enabled == 1 {
  103. if len(wrap.UrlArgs) == 2 && wrap.UrlArgs[0] == "api" && wrap.UrlArgs[1] == "products" {
  104. // Fix url
  105. if wrap.R.URL.Path[len(wrap.R.URL.Path)-1] != '/' {
  106. http.Redirect(wrap.W, wrap.R, wrap.R.URL.Path+"/"+utils.ExtractGetParams(wrap.R.RequestURI), 301)
  107. return
  108. }
  109. // XML
  110. wrap.W.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  111. wrap.W.Header().Set("Content-Type", "text/xml; charset=utf-8")
  112. wrap.W.WriteHeader(http.StatusOK)
  113. wrap.W.Write([]byte(this.api_GenerateXml(wrap)))
  114. } else if len(wrap.UrlArgs) == 1 {
  115. // Fix url
  116. if wrap.R.URL.Path[len(wrap.R.URL.Path)-1] != '/' {
  117. http.Redirect(wrap.W, wrap.R, wrap.R.URL.Path+"/"+utils.ExtractGetParams(wrap.R.RequestURI), 301)
  118. return
  119. }
  120. // Some info
  121. wrap.W.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
  122. wrap.W.WriteHeader(http.StatusOK)
  123. wrap.W.Write([]byte("Fave engine API mount point!"))
  124. } else {
  125. // User error 404 page
  126. wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
  127. return
  128. }
  129. } else {
  130. // User error 404 page
  131. wrap.RenderFrontEnd("404", fetdata.New(wrap, nil, true), http.StatusNotFound)
  132. return
  133. }
  134. }, func(wrap *wrapper.Wrapper) (string, string, string) {
  135. // No any page for back-end
  136. return "", "", ""
  137. })
  138. }