diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee44a96 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +target diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..ca88baa --- /dev/null +++ b/build.sbt @@ -0,0 +1,21 @@ +import Dependencies._ + +lazy val root = (project in file(".")). + settings( + crossScalaVersions := Seq("2.11.11", "2.12.6"), + scalacOptions += "-Ypartial-unification", + inThisBuild(List( + organization := "com.example", + scalaVersion := "2.12.6", + version := "0.1.0-SNAPSHOT" + )), + name := "awsio", + libraryDependencies ++= Seq( + "org.typelevel" %% "cats-core" % "1.1.0", + "org.typelevel" %% "cats-effect" % "1.0.0-RC2", + "software.amazon.awssdk" % "sqs" % "2.0.0-preview-10", + "software.amazon.awssdk" % "s3" % "2.0.0-preview-10", + "software.amazon.awssdk" % "sns" % "2.0.0-preview-10", + scalaTest % Test + ) + ) diff --git a/project/Dependencies.scala b/project/Dependencies.scala new file mode 100644 index 0000000..558929d --- /dev/null +++ b/project/Dependencies.scala @@ -0,0 +1,5 @@ +import sbt._ + +object Dependencies { + lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5" +} diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..d6e3507 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.1.6 diff --git a/src/main/scala/com/strad/awsio/com/strad/awsio/sns/SnsOps.scala b/src/main/scala/com/strad/awsio/com/strad/awsio/sns/SnsOps.scala new file mode 100644 index 0000000..2ceb146 --- /dev/null +++ b/src/main/scala/com/strad/awsio/com/strad/awsio/sns/SnsOps.scala @@ -0,0 +1,37 @@ +package com.strad.awsio.com.strad.awsio.sns + +import cats.~> +import cats.effect.Async +import java.util.concurrent.CompletableFuture +import software.amazon.awssdk.services.sns.SNSAsyncClient +import software.amazon.awssdk.services.sns.model.CreateTopicRequest +import software.amazon.awssdk.services.sns.model.CreateTopicResponse +import software.amazon.awssdk.services.sns.model.PublishRequest +import software.amazon.awssdk.services.sns.model.PublishResponse +import software.amazon.awssdk.services.sns.model.ListTopicsRequest +import software.amazon.awssdk.services.sns.model.ListTopicsResponse +import software.amazon.awssdk.services.sns.model.SubscribeRequest +import software.amazon.awssdk.services.sns.model.SubscribeResponse + +trait SnsTopicOps[F[_]] { + def create(createTopicRequest: CreateTopicRequest): F[CreateTopicResponse] + def publish(publishRequest: PublishRequest): F[PublishResponse] + def list(listTopicsRequest: ListTopicsRequest): F[ListTopicsResponse] + def subscribe(subscribeRequest: SubscribeRequest): F[SubscribeResponse] +} + +class SnsTopicOpsImpl[F[_]](client: SNSAsyncClient)(implicit f: Async[F], transform: CompletableFuture ~> F) extends SnsTopicOps[F] { + def create(createTopicRequest: CreateTopicRequest): F[CreateTopicResponse] = { + transform(client.createTopic(createTopicRequest)) + } + def publish(publishRequest: PublishRequest): F[PublishResponse] = { + transform(client.publish(publishRequest)) + } + def list(listTopicsRequest: ListTopicsRequest): F[ListTopicsResponse] = { + transform(client.listTopics(listTopicsRequest)) + } + def subscribe(subscribeRequest: SubscribeRequest): F[SubscribeResponse] = { + transform(client.subscribe(subscribeRequest)) + } +} + diff --git a/src/main/scala/com/strad/awsio/s3/Bucket.scala b/src/main/scala/com/strad/awsio/s3/Bucket.scala new file mode 100644 index 0000000..6b77366 --- /dev/null +++ b/src/main/scala/com/strad/awsio/s3/Bucket.scala @@ -0,0 +1,66 @@ +package com.strad.awsio.s3 + +import cats.~> +import cats.effect.Async +import java.util.concurrent.CompletableFuture +import software.amazon.awssdk.core.async.AsyncRequestBody +import software.amazon.awssdk.core.async.AsyncResponseTransformer +import software.amazon.awssdk.services.s3.S3AsyncClient +import software.amazon.awssdk.services.s3.model.CreateBucketRequest +import software.amazon.awssdk.services.s3.model.CreateBucketResponse +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest +import software.amazon.awssdk.services.s3.model.DeleteBucketResponse +import software.amazon.awssdk.services.s3.model.ListBucketsRequest +import software.amazon.awssdk.services.s3.model.ListBucketsResponse +import software.amazon.awssdk.services.s3.model.PutObjectRequest +import software.amazon.awssdk.services.s3.model.GetObjectRequest +import software.amazon.awssdk.services.s3.model.DeleteObjectResponse +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest +import software.amazon.awssdk.services.s3.model.PutObjectResponse +import software.amazon.awssdk.services.s3.model.GetObjectResponse +import software.amazon.awssdk.services.s3.model.UploadPartRequest +import software.amazon.awssdk.services.s3.model.UploadPartResponse + +trait BucketOps[F[_]] { + def create(createBucketRequest: CreateBucketRequest): F[CreateBucketResponse] + def list(listBucketsjRequest: ListBucketsRequest): F[ListBucketsResponse] + def delete(deleteBucketRequest: DeleteBucketRequest): F[DeleteBucketResponse] +} + +trait ObjectOps[F[_]] { + def put(putObjectRequest: PutObjectRequest, body: AsyncRequestBody): F[PutObjectResponse] + def putMultipart(uploadPartRequest: UploadPartRequest, body: AsyncRequestBody): F[UploadPartResponse] + def get(getObjectRequest: GetObjectRequest, asyncResponseTransformer: AsyncResponseTransformer[GetObjectResponse,GetObjectResponse]): F[GetObjectResponse] + def delete(DeleteObjectRequest: DeleteObjectRequest): F[DeleteObjectResponse] +} + + + +class BucketOpsImpl[F[_]](client: S3AsyncClient)(implicit f: Async[F], transform: CompletableFuture ~> F) extends BucketOps [F] { + def create(createBucketRequest: CreateBucketRequest): F[CreateBucketResponse] = { + transform(client.createBucket(createBucketRequest)) + } + def list(listBucketsRequest: ListBucketsRequest): F[ListBucketsResponse] = { + transform(client.listBuckets(listBucketsRequest)) + } + def delete(deleteBucketRequest: DeleteBucketRequest): F[DeleteBucketResponse] = { + transform(client.deleteBucket(deleteBucketRequest)) + } +} + +class ObjectOpsImpl[F[_]](client: S3AsyncClient)(implicit f: Async[F], transform: CompletableFuture ~> F) extends ObjectOps [F] { + def put(putObjectRequest: PutObjectRequest, body: AsyncRequestBody): F[PutObjectResponse] = { + transform(client.putObject(putObjectRequest, body)) + + } + def putMultipart(uploadPartRequest: UploadPartRequest, body: AsyncRequestBody): F[UploadPartResponse] = { + transform(client.uploadPart(uploadPartRequest, body)) + + } + def get(getObjectRequest: GetObjectRequest, asyncResponseTransformer: AsyncResponseTransformer[GetObjectResponse, GetObjectResponse]): F[GetObjectResponse] = { + transform(client.getObject(getObjectRequest, asyncResponseTransformer)) + } + def delete(deleteObjectRequest: DeleteObjectRequest): F[DeleteObjectResponse] = { + transform(client.deleteObject(deleteObjectRequest)) + } +} diff --git a/src/main/scala/com/strad/awsio/sqs/sqs.scala b/src/main/scala/com/strad/awsio/sqs/sqs.scala new file mode 100644 index 0000000..69633b7 --- /dev/null +++ b/src/main/scala/com/strad/awsio/sqs/sqs.scala @@ -0,0 +1,69 @@ +package com.strad.awsio.sqs + +import cats.~> +import cats.effect.Async +import java.util.concurrent.CompletableFuture +import software.amazon.awssdk.services.sqs.SQSAsyncClient +import software.amazon.awssdk.services.sqs.model.CreateQueueRequest +import software.amazon.awssdk.services.sqs.model.CreateQueueResponse +import software.amazon.awssdk.services.sqs.model.ListQueuesRequest +import software.amazon.awssdk.services.sqs.model.ListQueuesResponse +import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest +import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse +import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest +import software.amazon.awssdk.services.sqs.model.DeleteQueueResponse +import software.amazon.awssdk.services.sqs.model.SendMessageRequest +import software.amazon.awssdk.services.sqs.model.SendMessageResponse +import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest +import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest +import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse +import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest +import software.amazon.awssdk.services.sqs.model.DeleteMessageResponse +import software.amazon.awssdk.services.sqs.model.SendMessageBatchResponse + +trait QueueOps[F[_]] { + def create(queueRequest: CreateQueueRequest): F[CreateQueueResponse] + def list(listQueuesRequest: ListQueuesRequest): F[ListQueuesResponse] + def getUrl(getQueueUrlRequest: GetQueueUrlRequest): F[GetQueueUrlResponse] + def delete(deleteQueueRequest: DeleteQueueRequest): F[DeleteQueueResponse] +} + +trait MessageOps[F[_]] { + def send(sendMessageRequest: SendMessageRequest): F[SendMessageResponse] + def sendBatch(sendMessageBatchRequest: SendMessageBatchRequest): F[SendMessageBatchResponse] + def receive(receiveMessageRequest: ReceiveMessageRequest): F[ReceiveMessageResponse] + def delete(deleteMessageRequest: DeleteMessageRequest): F[DeleteMessageResponse] +} + + +class QueueOpsImpl[F[_]](client: SQSAsyncClient)(implicit f: Async[F], transform: CompletableFuture ~> F) extends QueueOps[F] { + def create(queueRequest: CreateQueueRequest): F[CreateQueueResponse] = { + transform(client.createQueue(queueRequest)) + } + def list(listQueuesRequest: ListQueuesRequest): F[ListQueuesResponse] = { + transform(client.listQueues(listQueuesRequest)) + } + def getUrl(getQueueUrlRequest: GetQueueUrlRequest): F[GetQueueUrlResponse] = { + transform(client.getQueueUrl(getQueueUrlRequest)) + } + def delete(deleteQueueRequest: DeleteQueueRequest): F[DeleteQueueResponse] = { + transform(client.deleteQueue(deleteQueueRequest)) + } +} + + +class MessageOpsImpl[F[_]](client: SQSAsyncClient)(implicit f: Async[F], transform: CompletableFuture ~> F) extends MessageOps[F] { + def send(sendMessageRequest: SendMessageRequest): F[SendMessageResponse] = { + transform(client.sendMessage(sendMessageRequest)) + } + def sendBatch(sendMessageBatchRequest: SendMessageBatchRequest): F[SendMessageBatchResponse] = { + transform(client.sendMessageBatch(sendMessageBatchRequest)) + } + def receive(receiveMessageRequest: ReceiveMessageRequest): F[ReceiveMessageResponse] = { + transform(client.receiveMessage(receiveMessageRequest)) + } + def delete(deleteMessageRequest: DeleteMessageRequest): F[DeleteMessageResponse] = { + transform(client.deleteMessage(deleteMessageRequest)) + } +} +