@@ -10,61 +10,77 @@ package utils
1010import javax .inject .Inject
1111import models .{ClaSignature , Contact }
1212import modules .Database
13-
13+ import software .amazon .awssdk .services .dynamodb .model ._
14+ import scala .collection .JavaConverters ._
1415import scala .concurrent .{ExecutionContext , Future }
15-
16- class DB @ Inject ()(database : Database )(implicit ec : ExecutionContext ) {
17-
18- import database .ctx ._
19-
20- private val contacts = quote {
21- querySchema[Contact ](
22- " salesforce.contact" ,
23- _.gitHubId -> " sf_cla__github_id__c" ,
24- _.firstName -> " firstname" ,
25- _.lastName -> " lastname"
26- )
27- }
28-
29- private val claSignatures = quote {
30- querySchema[ClaSignature ](
31- " salesforce.sf_cla__cla_signature__c" ,
32- _.signedOn -> " sf_cla__signed_on__c" ,
33- _.claVersion -> " sf_cla__cla_version__c" ,
34- _.contactGitHubId -> " sf_cla__contact__r__sf_cla__github_id__c"
35- )
16+ import play .api .Configuration
17+
18+
19+ class DB @ Inject ()(database : Database , config : Configuration )(implicit ec : ExecutionContext ) {
20+ private val dynamoDb = database.dynamoDb
21+ private val tableName = config.get[String ](" aws.dynamodb.table" )
22+
23+ def findContactByGitHubId (gitHubId : String ): Future [Option [Contact ]] = Future {
24+ val request = GetItemRequest .builder()
25+ .tableName(tableName)
26+ .key(Map (" PK" -> AttributeValue .builder().s(s " CONTACT# $gitHubId" ).build()).asJava)
27+ .build()
28+ val result = dynamoDb.getItem(request)
29+ if (result.hasItem) {
30+ val item = result.item().asScala
31+ Some (Contact (
32+ id = item.getOrElse(" id" , AttributeValue .builder().s(" " ).build()).s(),
33+ firstName = Some (item.getOrElse(" firstName" , AttributeValue .builder().s(" " ).build()).s()),
34+ lastName = item.getOrElse(" lastName" , AttributeValue .builder().s(" " ).build()).s(),
35+ email = item.getOrElse(" email" , AttributeValue .builder().s(" " ).build()).s(),
36+ gitHubId = gitHubId
37+ ))
38+ } else None
3639 }
3740
38- def findContactByGitHubId (gitHubId : String ): Future [Option [Contact ]] = {
39- val queryResult = run {
40- contacts.filter(_.gitHubId == lift(gitHubId))
41- }
42-
43- queryResult.map(_.headOption)
44- }
45-
46- def createContact (contact : Contact ): Future [Contact ] = {
47- val queryResult = run {
48- contacts.insert(lift(contact)).returning(_.id)
49- }
50-
51- queryResult.map(newId => contact.copy(id = newId))
41+ def createContact (contact : Contact ): Future [Contact ] = Future {
42+ val item = Map (
43+ " PK" -> AttributeValue .builder().s(s " CONTACT# ${contact.gitHubId}" ).build(),
44+ " id" -> AttributeValue .builder().s(contact.id).build(),
45+ " firstName" -> AttributeValue .builder().s(contact.firstName.getOrElse(" " )).build(),
46+ " lastName" -> AttributeValue .builder().s(contact.lastName).build(),
47+ " email" -> AttributeValue .builder().s(contact.email).build()
48+ ).asJava
49+ val request = PutItemRequest .builder().tableName(tableName).item(item).build()
50+ dynamoDb.putItem(request)
51+ contact
5252 }
5353
54- def createClaSignature (claSignature : ClaSignature ): Future [ClaSignature ] = {
55- val queryResult = run {
56- claSignatures.insert(lift(claSignature)).returning(_.id)
57- }
58-
59- queryResult.map(newId => claSignature.copy(id = newId))
54+ def createClaSignature (claSignature : ClaSignature ): Future [ClaSignature ] = Future {
55+ val item = Map (
56+ " PK" -> AttributeValue .builder().s(s " CLASIGNATURE# ${claSignature.contactGitHubId}" ).build(),
57+ " id" -> AttributeValue .builder().s(claSignature.id).build(),
58+ " signedOn" -> AttributeValue .builder().s(claSignature.signedOn).build(),
59+ " claVersion" -> AttributeValue .builder().s(claSignature.claVersion).build(),
60+ " contactGitHubId" -> AttributeValue .builder().s(claSignature.contactGitHubId).build()
61+ ).asJava
62+ val request = PutItemRequest .builder().tableName(tableName).item(item).build()
63+ dynamoDb.putItem(request)
64+ claSignature
6065 }
6166
62- def findClaSignaturesByGitHubIds (gitHubIds : Set [GitHub .User ]): Future [Set [ClaSignature ]] = {
63- val queryResult = run {
64- claSignatures.filter(claSignature => liftQuery(gitHubIds.map(_.username)).contains(claSignature.contactGitHubId))
65- }
66-
67- queryResult.map(_.toSet)
67+ def findClaSignaturesByGitHubIds (gitHubIds : Set [GitHub .User ]): Future [Set [ClaSignature ]] = Future {
68+ gitHubIds.map { user =>
69+ val request = GetItemRequest .builder()
70+ .tableName(tableName)
71+ .key(Map (" PK" -> AttributeValue .builder().s(s " CLASIGNATURE# ${user.username}" ).build()).asJava)
72+ .build()
73+ val result = dynamoDb.getItem(request)
74+ if (result.hasItem) {
75+ val item = result.item().asScala
76+ Some (ClaSignature (
77+ id = item.getOrElse(" id" , AttributeValue .builder().s(" " ).build()).s(),
78+ signedOn = item.getOrElse(" signedOn" , AttributeValue .builder().s(" " ).build()).s(),
79+ claVersion = item.getOrElse(" claVersion" , AttributeValue .builder().s(" " ).build()).s(),
80+ contactGitHubId = item.getOrElse(" contactGitHubId" , AttributeValue .builder().s(" " ).build()).s()
81+ ))
82+ } else None
83+ }.flatten.toSet
6884 }
6985
7086}
0 commit comments