document.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package orm
  2. import (
  3. "log"
  4. "net/http"
  5. "time"
  6. "github.com/jinzhu/gorm"
  7. "gogs.carducci-dante.gov.it/karmen/core/generator"
  8. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  9. )
  10. type GeneratorType struct {
  11. gorm.Model
  12. Name string
  13. }
  14. type Document struct {
  15. gorm.Model
  16. Name string
  17. OutputPath string
  18. CloudPath string
  19. GeneratorTypeID uint
  20. GeneratorType *GeneratorType
  21. KeepArtifacts bool
  22. Jobs []*Job
  23. RunningJobs []*Job
  24. CompletedJobs []*Job
  25. LastJob *Job `gorm:"-"`
  26. AllGeneratorTypes []*GeneratorType
  27. SelectedGeneratorType map[uint]string `gorm:"-"`
  28. }
  29. func (s *Document) GetID() uint { return s.ID }
  30. func (d *Document) String() string { return d.Name }
  31. func (d *Document) Create(args map[string]string, r *http.Request) (interface{}, error) {
  32. if r.Method == "GET" {
  33. document := new(Document)
  34. if err := DB().Find(&document.AllGeneratorTypes).Error; err != nil {
  35. return nil, err
  36. }
  37. return document, nil
  38. } else {
  39. document := new(Document)
  40. err := renderer.Decode(document, r)
  41. if err != nil {
  42. return nil, err
  43. }
  44. document, err = CreateDocument(document)
  45. if err != nil {
  46. return nil, err
  47. }
  48. return document, nil
  49. }
  50. }
  51. func (d *Document) Read(args map[string]string, r *http.Request) (interface{}, error) {
  52. var document Document
  53. id := args["id"]
  54. if err := DB().Preload("RunningJobs", "end = ?", time.Time{}).Where("id = ?", id).Find(&document).Error; err != nil {
  55. return nil, err
  56. }
  57. if err := DB().Preload("CompletedJobs", func(db *gorm.DB) *gorm.DB {
  58. return db.Where("end <> ?", time.Time{}).Limit(5).Order("end DESC")
  59. }).Where("id = ?", id).Find(&document).Error; err != nil {
  60. return nil, err
  61. }
  62. return &document, nil
  63. }
  64. func (d *Document) ReadAll(args map[string]string, r *http.Request) (interface{}, error) {
  65. var documents []*Document
  66. if err := DB().Preload("GeneratorType").Order("name").Find(&documents).Error; err != nil {
  67. return nil, err
  68. }
  69. return documents, nil
  70. }
  71. func (d *Document) Update(args map[string]string, r *http.Request) (interface{}, error) {
  72. if r.Method == "GET" {
  73. result, err := d.Read(args, r)
  74. if err != nil {
  75. return nil, err
  76. }
  77. document := result.(*Document)
  78. if err := DB().Find(&document.AllGeneratorTypes).Error; err != nil {
  79. return nil, err
  80. }
  81. document.SelectedGeneratorType = make(map[uint]string)
  82. document.SelectedGeneratorType[document.GeneratorTypeID] = "selected"
  83. return document, nil
  84. } else {
  85. document, err := d.Read(args, r)
  86. if err != nil {
  87. return nil, err
  88. }
  89. // FIXME: Should not be hard set.
  90. document.(*Document).KeepArtifacts = false
  91. err = renderer.Decode(document, r)
  92. if err != nil {
  93. return nil, err
  94. }
  95. _, err = SaveDocument(document)
  96. if err != nil {
  97. return nil, err
  98. }
  99. document, err = d.Read(args, r)
  100. if err != nil {
  101. return nil, err
  102. }
  103. return document.(*Document), nil
  104. }
  105. }
  106. func (d *Document) Delete(args map[string]string, r *http.Request) (interface{}, error) {
  107. document, err := d.Read(args, r)
  108. if err != nil {
  109. return nil, err
  110. }
  111. if err := DB().Unscoped().Delete(document.(*Document)).Error; err != nil {
  112. return nil, err
  113. }
  114. return document.(*Document), nil
  115. }
  116. func SaveDocument(document interface{}) (interface{}, error) {
  117. if err := DB().Save(document).Error; err != nil {
  118. return nil, err
  119. }
  120. return document, nil
  121. }
  122. func CreateDocument(document *Document) (*Document, error) {
  123. if err := DB().Create(document).Error; err != nil {
  124. return nil, err
  125. }
  126. return document, nil
  127. }
  128. func GetDocumentExecute(args map[string]string) (interface{}, error) {
  129. var document Document
  130. if err := DB().Preload("GeneratorType").First(&document, args["id"]).Error; err != nil {
  131. return nil, err
  132. }
  133. // Create a new job
  134. job := new(Job)
  135. job.DocumentID = document.ID
  136. err := DB().Create(job).Error
  137. if err != nil {
  138. return nil, err
  139. }
  140. document.LastJob = job
  141. log.Printf("Start concurrent job %d for generator %s", job.ID, document.Name)
  142. gen := generator.Generators[document.GeneratorType.Name]
  143. gen.SetJobId(job.ID)
  144. go gen.Run()
  145. return &document, nil
  146. }