@@ -3,21 +3,26 @@ package models
3
3
import java .util .Date
4
4
import javax .inject .{ Inject , Provider , Singleton }
5
5
6
+ import akka .{ Done , NotUsed }
7
+
6
8
import scala .concurrent .{ ExecutionContext , Future }
7
9
import scala .language .postfixOps
8
- import akka .stream .Materializer
9
- import play .api .libs .json .{ JsNull , JsObject , JsString , JsValue , JsArray }
10
+ import akka .stream .{ IOResult , Materializer }
11
+ import play .api .libs .json .{ JsArray , JsNull , JsObject , JsString , JsValue }
10
12
import play .api .libs .json .JsLookupResult .jsLookupResultToJsLookup
11
13
import play .api .libs .json .JsValue .jsValueToJsLookup
12
14
import play .api .libs .json .Json
13
15
import play .api .libs .json .Json .toJsFieldJsValueWrapper
14
- import org .elastic4play .BadRequestError
16
+ import org .elastic4play .{ BadRequestError , InternalError }
15
17
import org .elastic4play .models .{ AttributeDef , BaseEntity , ChildModelDef , EntityDef , HiveEnumeration , AttributeFormat ⇒ F , AttributeOption ⇒ O }
16
- import org .elastic4play .services .{ Attachment , DBLists }
18
+ import org .elastic4play .services .{ Attachment , AttachmentSrv , DBLists }
17
19
import org .elastic4play .utils .MultiHash
18
20
import models .JsonFormat .artifactStatusFormat
21
+ import play .api .Logger
19
22
import services .{ ArtifactSrv , AuditedModel }
20
23
24
+ import scala .util .Success
25
+
21
26
object ArtifactStatus extends Enumeration with HiveEnumeration {
22
27
type Type = Value
23
28
val Ok, Deleted = Value
@@ -42,9 +47,11 @@ trait ArtifactAttributes { _: AttributeDef ⇒
42
47
class ArtifactModel @ Inject () (
43
48
caseModel : CaseModel ,
44
49
val dblists : DBLists ,
50
+ attachmentSrv : AttachmentSrv ,
45
51
artifactSrv : Provider [ArtifactSrv ],
46
52
implicit val mat : Materializer ,
47
53
implicit val ec : ExecutionContext ) extends ChildModelDef [ArtifactModel , Artifact , CaseModel , Case ](caseModel, " case_artifact" ) with ArtifactAttributes with AuditedModel {
54
+ private [ArtifactModel ] lazy val logger = Logger (getClass)
48
55
override val removeAttribute : JsObject = Json .obj(" status" → ArtifactStatus .Deleted )
49
56
50
57
override def apply (attributes : JsObject ): Artifact = {
@@ -59,7 +66,7 @@ class ArtifactModel @Inject() (
59
66
throw BadRequestError (s " Artifact must contain a message or on ore more tags " )
60
67
if (keys.contains(" data" ) == keys.contains(" attachment" ))
61
68
throw BadRequestError (s " Artifact must contain data or attachment (but not both) " )
62
- computeId(parent, attrs).map { id ⇒
69
+ computeId(parent.getOrElse( throw InternalError ( s " artifact $attrs has no parent " )) , attrs).map { id ⇒
63
70
attrs + (" _id" → JsString (id))
64
71
}
65
72
}
@@ -85,17 +92,23 @@ class ArtifactModel @Inject() (
85
92
Future .successful(updateAttrs)
86
93
}
87
94
}
88
- def computeId (parent : Option [ BaseEntity ] , attrs : JsObject ): Future [String ] = {
95
+ def computeId (parent : BaseEntity , attrs : JsObject ): Future [String ] = {
89
96
// in order to make sure that there is no duplicated artifact, calculate its id from its content (dataType, data, attachment and parent)
90
97
val mm = new MultiHash (" MD5" )
91
98
mm.addValue((attrs \ " data" ).asOpt[JsValue ].getOrElse(JsNull ))
92
99
mm.addValue((attrs \ " dataType" ).asOpt[JsValue ].getOrElse(JsNull ))
93
- (attrs \ " attachment" \ " filepath" ).asOpt[String ]
94
- .fold(Future .successful(()))(file ⇒ mm.addFile(file))
95
- .map { _ ⇒
96
- mm.addValue(JsString (parent.fold(" " )(_.id)))
97
- mm.digest.toString
98
- }
100
+ for {
101
+ IOResult (_, done) ← (attrs \ " attachment" \ " filepath" ).asOpt[String ]
102
+ .fold(Future .successful(IOResult (0 , Success (Done ))))(file ⇒ mm.addFile(file))
103
+ _ ← Future .fromTry(done)
104
+ _ ← (attrs \ " attachment" \ " id" ).asOpt[String ]
105
+ .fold(Future .successful(NotUsed : NotUsed )) { fileId ⇒
106
+ mm.addFile(attachmentSrv.source(fileId))
107
+ }
108
+ } yield {
109
+ mm.addValue(JsString (parent.id))
110
+ mm.digest.toString
111
+ }
99
112
}
100
113
101
114
override def getStats (entity : BaseEntity ): Future [JsObject ] = {
0 commit comments