sentence.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package mint
  2. import (
  3. "net/http"
  4. "strconv"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "github.com/go-pg/pg/v10"
  8. "github.com/go-redis/redis/v8"
  9. "time"
  10. "encoding/json"
  11. )
  12. type Sentence struct {
  13. Id int `form:"id" json:"id" `
  14. IsPr bool `form:"is_pr" json:"is_pr" `
  15. BlockId string `form:"block_id" json:"block_id"`
  16. ChannelId int `form:"channel_id" json:"channel_id"`
  17. BookId int `form:"book_id" json:"book_id"`
  18. Paragraph int `form:"paragraph" json:"paragraph"`
  19. WordStart int `form:"word_start" json:"word_start"`
  20. WordEnd int `form:"word_end" json:"word_end"`
  21. Content string `form:"content" json:"content"`
  22. ContentType string `form:"content_type" json:"content_type"`
  23. Type string `form:"type" json:"type"`
  24. Lang string `form:"lang" json:"lang"`
  25. Status string `form:"status" json:"status"`
  26. EditorId int
  27. OwnerId int
  28. Version int
  29. DeletedAt time.Time
  30. CreatedAt time.Time
  31. UpdatedAt time.Time
  32. }
  33. type SentenceHolder struct{
  34. Data []Sentence
  35. }
  36. func (i *SentenceHolder) UnmarshalJSON(b []byte) error{
  37. return json.Unmarshal(b, &i.Data)
  38. }
  39. //display a list of all sentences
  40. func SentencesIndex(db *pg.DB) gin.HandlerFunc {
  41. return func(c *gin.Context) {
  42. active:= c.Query("active")
  43. // TODO 补充业务逻辑
  44. var sentences []Sentence
  45. switch active {
  46. case "channel":
  47. //某channel句子列表
  48. channel := c.Query("channel")
  49. //request body sentence array with book para star end
  50. var form SentenceHolder
  51. if err := c.ShouldBindJSON(&form); err != nil {
  52. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  53. return
  54. }
  55. sentences = make([]Sentence,0,len(form.Data))
  56. var oneSent Sentence
  57. count := 0
  58. for _, value := range form.Data{
  59. err := db.Model(&oneSent).Column("id","book_id","paragraph","word_start","word_end","content","content_type").Where("channel = ?",channel).Where("book_id = ?",value.BookId).Where("paragraph = ?",value.Paragraph).Where("word_start = ?",value.WordStart).Where("word_end = ?",value.WordEnd).First()
  60. //errors.Is(err, gorm.ErrRecordNotFound)
  61. if err != nil {
  62. panic(err)
  63. }
  64. sentences[count] = oneSent
  65. }
  66. case "sentence":
  67. //某句子所有channel记录
  68. book_id := c.Query("book")
  69. para := c.Query("para")
  70. start := c.Query("start")
  71. end := c.Query("end")
  72. err := db.Model(&sentences).Column("id","book_id","paragraph","word_start","word_end","content","content_type").Where("book_id = ?",book_id).Where("paragraph = ?",para).Where("word_start = ?",start).Where("word_end = ?",end).Select()
  73. if err != nil {
  74. panic(err)
  75. }
  76. }
  77. c.JSON(http.StatusOK, gin.H{
  78. "status":"succes",
  79. "message":"",
  80. "data": sentences,
  81. })
  82. }
  83. }
  84. //return an HTML form for creating a new sentence
  85. func SentencesNew(db *pg.DB) gin.HandlerFunc{
  86. return func(c *gin.Context){
  87. //TODO 业务逻辑
  88. c.HTML(http.StatusOK,"sentences_new.html",gin.H{
  89. "message":"ok",
  90. })
  91. }
  92. }
  93. //create new sentence
  94. func SentencesCreate(db *pg.DB) gin.HandlerFunc{
  95. return func(c *gin.Context){
  96. //channel := c.Query("channel")
  97. active := c.Query("active")
  98. var form SentenceHolder
  99. if err := c.ShouldBindJSON(&form); err != nil {
  100. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  101. return
  102. }
  103. //TODO 查询权限
  104. switch active {
  105. case "create":
  106. case "pr":
  107. }
  108. /*
  109. _, err := db.Model(newSentence).Insert()
  110. if err != nil {
  111. panic(err)
  112. }
  113. */
  114. //建立成功
  115. c.JSON(http.StatusOK,gin.H{
  116. "status":"succes",
  117. "message":"",
  118. "data":form.Data,
  119. })
  120. }
  121. }
  122. //display a specific Sentence
  123. func SentencesShow(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  124. return func(c *gin.Context) {
  125. id,err := strconv.Atoi(c.Param("id"))
  126. if err != nil {
  127. panic(err)
  128. }
  129. fmt.Println("get sentence id=" + c.Param("id"))
  130. rkey := "sentence://id"
  131. n, err := rdb.Exists(ctx,rkey).Result()
  132. if err != nil {
  133. fmt.Println(err)
  134. }else if n == 0 {
  135. fmt.Println("redis key not exist")
  136. }else{
  137. fmt.Println("redis key exist")
  138. val, err := rdb.HGetAll(ctx, rkey).Result()
  139. if err != nil || val == nil {
  140. //有错误或者没查到
  141. fmt.Println("redis error")
  142. }else{
  143. fmt.Println("redis no error")
  144. c.JSON(http.StatusOK, gin.H{
  145. "data": val,
  146. })
  147. return
  148. }
  149. }
  150. sentence := &Sentence{Id: id}
  151. err = db.Model(sentence).Column("id","uid","name","description","description_type","owner_id","setting","status","version","updated_at").WherePK().Select()
  152. if err != nil {
  153. panic(err)
  154. }
  155. c.JSON(http.StatusOK, gin.H{
  156. "data": sentence,
  157. })
  158. //写入redis
  159. rdb.HSet(ctx,rkey,id,sentence)
  160. }
  161. }
  162. //return an HTML form for edit a sentence
  163. func SentencesEdit(db *pg.DB) gin.HandlerFunc{
  164. return func(c *gin.Context){
  165. //TODO 业务逻辑
  166. c.HTML(http.StatusOK,"sentences_edit.html",gin.H{
  167. "name":"ok",
  168. })
  169. }
  170. }
  171. //update a specific sentence
  172. func SentencesUpdate(db *pg.DB,rdb *redis.Client) gin.HandlerFunc{
  173. return func(c *gin.Context){
  174. var form Sentence
  175. if err := c.ShouldBindJSON(&form); err != nil {
  176. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  177. return
  178. }
  179. //补充业务逻辑
  180. _,err := db.Model(&form).Column("name","description","description_type","status","setting").WherePK().Update()
  181. if err != nil {
  182. panic(err)
  183. }
  184. c.JSON(http.StatusOK,gin.H{
  185. "message":form,
  186. })
  187. //delete redis
  188. rkey := "sentence://id/"+strconv.Itoa(form.Id)
  189. rdb.Del(ctx,rkey)
  190. }
  191. }
  192. //delete a specific sentence
  193. func SentencesDestroy(db *pg.DB ,rdb *redis.Client) gin.HandlerFunc{
  194. return func(c *gin.Context){
  195. id,err := strconv.Atoi(c.Param("id"))
  196. if err != nil {
  197. panic(err)
  198. }
  199. sentence := &Sentence{
  200. Id:int(id),
  201. }
  202. //删之前获取 course_id
  203. _, err = db.Model(sentence).WherePK().Delete()
  204. if err != nil {
  205. panic(err)
  206. }
  207. //删除article_list表相关项目
  208. c.JSON(http.StatusOK,gin.H{
  209. "message": c.Param("id"),
  210. })
  211. rkey := "sentence://id/"+c.Param("id")
  212. rdb.Del(ctx,rkey)
  213. }
  214. }