@startuml submission-storage
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml

!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v10.0/dist
!include AWSPuml/AWSCommon.puml
!include AWSPuml/ApplicationIntegration/APIGateway.puml
!include AWSPuml/MigrationTransfer/all.puml
!include AWSPuml/Storage/all.puml
!include AWSPuml/Compute/all.puml

/' Clients '/
together {
    Person(sftpClient, "SFTP Client")
    Person(httpsClient, "HTTPS Client")
    Person(s3Client, "S3 Client")
}

together {
    TransferFamilyAWSSFTP(sftp, "sftp://sftp.data.gnss.ga.gov.au", "AWS")
    APIGateway(apiGateway, "https://data.gnss.ga.gov.au/api", "AWS")
    SimpleStorageServiceBucket(s3SubmissionRequestStorage, "s3://geodesy-archive-submission-requests", "AWS")
}

together {
    LAYOUT_LEFT_RIGHT()
    SimpleStorageServiceBucket(sftpStorage, "geodesy-archive-sftp", "AWS")
    Lambda(sftpAuth, "sftp-authoriser", "AWS")
    LAYOUT_TOP_DOWN()
}

/' Request Handlers '/
together {
    Lambda(sftpSubmissionRequestHandler, "sftp-submission-request-handler", "AWS")
    Lambda(httpSubmissionRequestHandler, "http-submission-request-handler", "AWS")
    Lambda(s3SubmissionRequestHandler, "s3-submission-request-handler", "AWS")
}

SimpleStorageServiceBucket(submissionStorage, "geodesy-archive-submissions", "AWS")

/' SFTP Submission '/

/' SFTP Login '/
RelIndex(Login-Index(), sftpClient, sftp, "Authenticate")
RelIndex(Login-Index(), sftp, sftpAuth, "Call")
RelIndex_R(Login-Index(), sftpAuth, sftpStorage, "Create .id-token file")

setIndex(1)

/' SFTP Put '/
RelIndex(SFTP-Index(), sftpClient, sftp, "Put file")
RelIndex(SFTP-Index(), sftp, sftpStorage, "Put object")

RelIndex(SFTP-Index(), sftpStorage, sftpSubmissionRequestHandler, "Raise S3 PutObject event")
RelIndex(SFTP-Index(), sftpSubmissionRequestHandler, submissionStorage, "Put object")

setIndex(1)

/' HTTPS Submission '/
RelIndex(HTTP-Index(), httpsClient, apiGateway, "HTTPS PUT")
RelIndex(HTTP-Index(), apiGateway, httpSubmissionRequestHandler, "HTTPS PUT")
RelIndex(HTTP-Index(), httpSubmissionRequestHandler, submissionStorage, "Put object")

/' S3 Submission '/
setIndex(1)

RelIndex(S3-Index(), s3Client, s3SubmissionRequestStorage, "Put object")
RelIndex(S3-Index(), s3SubmissionRequestStorage, s3SubmissionRequestHandler, "Raise S3 PutObject event")
RelIndex(S3-Index(), s3SubmissionRequestHandler, submissionStorage, "Put object")

@enduml
