Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# package directories
../node_modules
../jspm_packages
../.idea

../package-lock.json

.env
# Serverless directories
.serverless

.gitignore

19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,21 @@ Endpoint backend: https://o3lc79zr1i.execute-api.us-east-1.amazonaws.com/dev
#### Description: Get a product by ID
- productId is required
- productId is String
- curl --location --request GET 'https://o3lc79zr1i.execute-api.us-east-1.amazonaws.com/dev/products/ABCDE102030'
- curl --location --request GET 'https://o3lc79zr1i.execute-api.us-east-1.amazonaws.com/dev/products/ABC001'

### POST - Create product - /product
#### Description: Create a product

- title: String - is required
- description: String - is requires
- price: Number - is required
- count": Number - is required

## Import

### Get - Image
#### Description: Get image from bucket
- curl --location --request GET 'https://guouzuadzd.execute-api.us-east-1.amazonaws.com/dev/import/Alexa'

## Frontend
### URL: http://epam-shopcart.s3-website-us-east-1.amazonaws.com/
11 changes: 11 additions & 0 deletions import-service/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const dotenv = require('dotenv');

module.exports = async ({ options, resolveConfigurationProperty }) => {
// Load env vars into Serverless environment
// You can do more complicated env var resolution with dotenv here
const envVars = dotenv.config({ path: '.env' }).parsed;
return Object.assign(
{},
envVars, // `dotenv` environment variables
);
};
18 changes: 18 additions & 0 deletions import-service/handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict';

module.exports.hello = async (event) => {
return {
statusCode: 200,
body: JSON.stringify(
{
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
},
null,
2
),
};

// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};
15 changes: 15 additions & 0 deletions import-service/image.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
'use strict';

const utils = require('./utils/utils.aws.functions');

module.exports.importFileParser = async (event) => {
console.log(`Event: ${JSON.stringify(event)}`);
for (const record of event.Records) {
await utils.moveImage(record.s3.object.key);
}

return {
statusCode: 200,
body: `importFileParser executed`
};
}
27 changes: 27 additions & 0 deletions import-service/images.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';
const utils = require('./utils/utils.aws.functions');

module.exports.importProductsFile = async (event) => {
const body = {};
let status = 200

if (!event[`pathParameters`].nameImage) {
status = 500;
body.message = 'Name image not provided'
} else {
const image = event[`pathParameters`].nameImage;
const result = await utils.getSignedImage(image).then((data) => data).catch(error => error);

body.message = result.message;
body.url = result.status === 200 ? result.url : '';
}

return {
statusCode: status,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true,
},
body: JSON.stringify(body)
};
}
90 changes: 90 additions & 0 deletions import-service/serverless.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
# docs.serverless.com
#
# Happy Coding!

service: import-service
# app and org for use with dashboard.serverless.com
#app: your-app-name
#org: your-org-name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
frameworkVersion: '3'

provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-east-1
profile: default
environment:
REGION: ${self:custom.dotenvVars.REGION, env:REGION, ''}
BUCKET: ${self:custom.dotenvVars.BUCKET, env:BUCKET, ''}
PATH_AWS: ${self:custom.dotenvVars.PATH_AWS, env:PATH_AWS, ''}
SQS_URL: ${self:custom.dotenvVars.SQS_URL, env:SQS_URL, ''}
iamRoleStatements:
- Effect: Allow
Action: 's3:ListBucket'
Resource:
- 'arn:aws:s3:::src-image-shop'
- Effect: Allow
Action:
- 's3:*'
Resource:
- 'arn:aws:s3:::src-image-shop/*'
- Effect: Allow
Action: 'sqs:SendMessage'
Resource: 'arn:aws:sqs:us-east-1:436988374415:catalogItemsQueue.fifo'

plugins:
- serverless-webpack
- serverless-dotenv-plugin

custom:
webpack:
webpackConfig: 'webpack.config.js' # Name of webpack configuration file
includeModules: false
packager: 'npm'
dotenvVars: ${./configs.js)}

functions:
hello:
handler: handler.hello
getSignedImage:
handler: images.importProductsFile
events:
- http:
path: /import/{nameImage}
method: get
cors:
origins: '*'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
allowCredentials: false
request:
parameters:
paths:
nameImage: true
importFileParser:
handler: image.importFileParser
events:
- s3:
bucket: src-image-shop
event: s3:ObjectCreated:*
rules:
- prefix: images/
existing: true
76 changes: 76 additions & 0 deletions import-service/test/image.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
const expect = require('chai').expect;
const lambda = require('lambda-tester');
const getImage = require('../images').importProductsFile;
const moveImage = require('../image').importFileParser;

describe('import-service', () => {
describe('lambdas', () => {
describe('get-image', () => {
it('Should return 500', async () => {
const result = await lambda(getImage)
.event({'pathParameters': {'nameImage': ''}})
.expectResult(data => data);
expect(JSON.parse(result.statusCode)).equals(500);
expect(JSON.parse(result.body).message).equals('Name image not provided')
});

it('Should return 200', async () => {
const result = await lambda(getImage)
.event({'pathParameters': {'nameImage': 'Alexa'}})
.expectResult(data => data);
expect(JSON.parse(result.statusCode)).equals(200);
expect(JSON.parse(result.body).message).equals('Success');
});
});

describe('move-image', () => {
it('Should return', async () => {
const result = await lambda(moveImage)
.event(
{
"Records": [
{
"eventVersion": "2.1",
"eventSource": "aws:s3",
"awsRegion": "us-east-1",
"eventTime": "2022-08-06T14:29:57.320Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "AWS:AIDAWLPUJNWH4HTC6FCEQ"
},
"requestParameters": {
"sourceIPAddress": "187.193.146.100"
},
"responseElements": {
"x-amz-request-id": "398JW4JQ4K36K77H",
"x-amz-id-2": "fNnnzzT9SbH+TsRwnOyqL3VpRskNgK7bF8TlstrSHTeQDk8Y70RkwrroUuN44gWxb5chRgfIERPFGtJLEzbd513QkiXFMEuf"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "import-service-dev-importFileParser-057a87b0c6d7a62748d8b7e8958d9482",
"bucket": {
"name": "src-image-shop",
"ownerIdentity": {
"principalId": "A62BSUDDNWO6V"
},
"arn": "arn:aws:s3:::src-image-shop"
},
"object": {
"key": "images/Alexa.jpg",
"size": 31761,
"eTag": "607177f4d4599df93e5528f477d8c315",
"sequencer": "0062EE7AE54AF819E8"
}
}
}
]
}
)
.expectResult(data => data);

expect(result.statusCode).equals(200);
});
});

});
});
Loading