Skip to content

Repository files navigation

README

Here is a symfony project that uses DDD and hexagonal architecture. The project queries an internal REST API prestashop.marmitakoo.test:4010/feed/products. This internal endpoint is generated by stoplight/prism using the mock file prism/marmitakoo.yaml.

The output of the internal API is a JSON that looks like this:

{
   "products":[
      {
         "id":"44622e6e-4d68-46e0-85be-5b0e9c99e414",
         "name":"Practical Metal Gloves",
         "description":"Aspernatur laboriosam suscipit enim quia maxime provident veniam. Quod porro voluptatibus officiis c",
         "link":"https://javon.net",
         "image":[
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Aliquid culpa rerum molestiae ut soluta voluptatem voluptatibus itaque."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Soluta esse velit laborum velit et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Quae consequatur aliquam necessitatibus quis fugiat vero."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Dolores omnis veniam minima aliquam ea deleniti."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Suscipit qui culpa."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Rerum saepe eveniet quia in et iure vero."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Aliquid voluptatem rerum laborum et nisi dolor."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Provident maiores nihil velit voluptatibus nihil."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Tempore consequatur exercitationem reiciendis sunt enim unde."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Qui voluptas nulla perferendis provident consequuntur non tempore."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Distinctio quis et inventore fuga quasi sapiente dignissimos explicabo nulla."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Et consectetur consequatur et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Voluptatum sunt dolor nam vitae."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Quas itaque iste sit architecto iste alias."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Placeat odit qui qui et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Officia dolore esse voluptatem voluptatum quasi."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Ut quae aut enim neque veniam."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Repellendus eos unde autem ut."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Iusto distinctio quaerat amet aliquam voluptas magni."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Pariatur maxime eum."
            }
         ],
         "availability":{
            "stock":69
         },
         "price":{
            "regular":49.08989279160331,
            "on_sale":70.05727532816405
         },
         "variations":[
            {
               "id":"a83f1d49-3892-4d7f-aa96-ac620e6908f7",
               "color":"olive",
               "material":"Fresh",
               "updatedAt":"Tue Sep 08 2020 03:22:37 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"75309ab4-6bcf-4ce7-af39-49ea6f24a5a9",
               "color":"purple",
               "material":"Wooden",
               "updatedAt":"Mon Sep 07 2020 21:27:51 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"8ae38276-f0e6-427d-848b-a64febe831fe",
               "color":"ivory",
               "material":"Plastic",
               "updatedAt":"Tue Sep 08 2020 03:15:42 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"a83ec2f9-0b0d-41bb-bcba-870b09feb125",
               "color":"lime",
               "material":"Metal",
               "updatedAt":"Mon Sep 07 2020 17:11:52 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"ab751420-d09a-4371-81d2-762b0ad73d0f",
               "color":"ivory",
               "material":"Metal",
               "updatedAt":"Mon Sep 07 2020 22:06:16 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"d29405eb-493a-4759-9565-a9231bfe1c12",
               "color":"black",
               "material":"Soft",
               "updatedAt":"Mon Sep 07 2020 20:08:48 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"b1479fa4-5d5f-4d9a-bf5a-be68590ae067",
               "color":"violet",
               "material":"Frozen",
               "updatedAt":"Tue Sep 08 2020 02:42:08 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"1ada0f38-d18c-40ff-828d-5b75e7aede01",
               "color":"olive",
               "material":"Fresh",
               "updatedAt":"Tue Sep 08 2020 10:55:00 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"eb306aa6-b5a3-4033-85af-3c4c88f53c3c",
               "color":"black",
               "material":"Wooden",
               "updatedAt":"Mon Sep 07 2020 22:01:30 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"6d17e789-ee6b-43e3-b6ab-d2ff2c79f12d",
               "color":"fuchsia",
               "material":"Metal",
               "updatedAt":"Mon Sep 07 2020 20:47:58 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"1a8983bd-83ba-436c-b6ab-5cd70447e6f3",
               "color":"sky blue",
               "material":"Fresh",
               "updatedAt":"Tue Sep 08 2020 12:32:53 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"0886e37c-da9e-4ce9-a779-48f085544f96",
               "color":"orange",
               "material":"Concrete",
               "updatedAt":"Mon Sep 07 2020 15:43:08 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"e9d59c28-1962-494b-8dee-eb164b65d3a0",
               "color":"yellow",
               "material":"Steel",
               "updatedAt":"Tue Sep 08 2020 08:47:42 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"b88791b5-7f38-473f-b015-2f92f84d04dd",
               "color":"green",
               "material":"Frozen",
               "updatedAt":"Tue Sep 08 2020 01:25:58 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"369170aa-cb2f-4b5f-8c3f-d8ec62f12e1b",
               "color":"plum",
               "material":"Frozen",
               "updatedAt":"Tue Sep 08 2020 07:23:01 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"56dd962f-ee8a-4f26-8736-d9d891355709",
               "color":"silver",
               "material":"Frozen",
               "updatedAt":"Tue Sep 08 2020 02:40:34 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"478c3c93-68b0-45c4-b2a6-c33c26ff24e5",
               "color":"sky blue",
               "material":"Fresh",
               "updatedAt":"Mon Sep 07 2020 17:08:41 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"ffc12a4b-7c81-4bb4-8cc7-c48573395014",
               "color":"blue",
               "material":"Steel",
               "updatedAt":"Tue Sep 08 2020 03:45:15 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"279fe856-7a2f-4cf6-a603-533141d75ece",
               "color":"azure",
               "material":"Steel",
               "updatedAt":"Mon Sep 07 2020 17:25:19 GMT+0000 (Coordinated Universal Time)"
            },
            {
               "id":"8bad9885-a00c-4f39-89a4-bb80415b1245",
               "color":"teal",
               "material":"Granite",
               "updatedAt":"Mon Sep 07 2020 18:38:08 GMT+0000 (Coordinated Universal Time)"
            }
         ],
         "updatedAt":"Mon Sep 07 2020 23:48:11 GMT+0000 (Coordinated Universal Time)"
      },
  ]
}

The purpose of this project is to expose two REST endpoints http://marmiads.test/feed/products and http://marmiads.test/ads.

The first endpoint, http://marmiads.test/feed/products is going to sanitize the products given by the internal API and return a JSON with the sanitized products. The output will look very similar to the internal endpoint:

{
   "products":[
      {
         "id":"44622e6e-4d68-46e0-85be-5b0e9c99e414",
         "name":"Practical Metal Gloves",
         "description":"Aspernatur laboriosam suscipit enim quia maxime provident veniam. Quod porro voluptatibus officiis c",
         "link":"https://javon.net",
         "image":[
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Aliquid culpa rerum molestiae ut soluta voluptatem voluptatibus itaque."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Soluta esse velit laborum velit et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Quae consequatur aliquam necessitatibus quis fugiat vero."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Dolores omnis veniam minima aliquam ea deleniti."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Suscipit qui culpa."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Rerum saepe eveniet quia in et iure vero."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Aliquid voluptatem rerum laborum et nisi dolor."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Provident maiores nihil velit voluptatibus nihil."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Tempore consequatur exercitationem reiciendis sunt enim unde."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Qui voluptas nulla perferendis provident consequuntur non tempore."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Distinctio quis et inventore fuga quasi sapiente dignissimos explicabo nulla."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Et consectetur consequatur et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Voluptatum sunt dolor nam vitae."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Quas itaque iste sit architecto iste alias."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Placeat odit qui qui et."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Officia dolore esse voluptatem voluptatum quasi."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Ut quae aut enim neque veniam."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Repellendus eos unde autem ut."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Iusto distinctio quaerat amet aliquam voluptas magni."
            },
            {
               "url":"http://lorempixel.com/640/480",
               "alt":"Pariatur maxime eum."
            }
         ],
         "availability":{
            "stock":69
         },
         "price":{
            "regular":70.05727532816405,
            "on_sale":49.08989279160331
         },
         "variations":[
            {
               "id":"1a8983bd-83ba-436c-b6ab-5cd70447e6f3",
               "color":"sky blue",
               "material":"Fresh",
               "updatedAt":"2020-09-08 12:32:53 +00:00"
            }
         ],
         "updatedAt":"2020-09-07 23:48:11.0 +00:00"
      },
  ]
}

The second endpoint, http://marmiads.test/ads is going to return a list of ads in JSON format according to the processed products. The output will like this:

{
    "advertisements": {
        "enabled": [
            {
                "id": "44622e6e-4d68-46e0-85be-5b0e9c99e414",
                "name": "Practical Metal Gloves",
                "link": "https://javon.net",
                "images": [
                    "http://lorempixel.com/640/480"
                ],
                "discount": "29%",
                "message": "",
                "colors": ["sky blue"],
                "materials": ["Fresh"],
            }
        ]
    },
    "disabled": []
}

Setup

  • Clone this repository to any directory you want.
  • Add to the end of your /etc/hosts the line 127.0.0.1 marmiads.test.
  • Start the services to run the project. Run docker-compose up inside the directory you just cloned.
  • Install project requirements. Run docker exec -it project-php composer install.
  • You should be able to access to the endpoints http://marmiads.test/feed/products and http://marmiads.test/ads.

Run Tests

  • Run docker exec -it project-php php bin/phpunit

About

Symfony project that uses DDD and hexagonal architecture to expose REST endpoints.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages