diff --git a/.gitignore b/.gitignore
index 930e1e21e27cc2916f9dd36aa9e577d0fb0b2ee0..f8810d3065e89d017a7d3c35e8e08313e20373b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,4 +23,6 @@
 /public/assets/
 /assets/vendor/
 ###< symfony/asset-mapper ###
-/.idea
\ No newline at end of file
+/.idea
+.env
+.env.test
\ No newline at end of file
diff --git a/docker-compose.yaml b/docker-compose.yaml
index b87becc27b74f2fc52cb4f57ac255c498594a390..5548380ea032495d84581da3009d39a6b92b816d 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -9,7 +9,7 @@ services:
       POSTGRES_PASSWORD: 12345
       POSTGRES_HOST_AUTH_METHOD: trust
     ports:
-      - "5433:${DATABASE_PORT}"
+      - "${DATABASE_PORT}:${DATABASE_PORT}"
     networks:
       - internal
   nginx:
@@ -33,8 +33,6 @@ services:
         APP_BASE_DIR: ${APP_BASE_DIR-.}
     volumes:
       - ".:/app"
-    ports:
-      - "9000:9000"
     restart: unless-stopped
     networks:
       - internal
diff --git a/migrations/Version20240424072545.php b/migrations/Version20240426064235.php
similarity index 99%
rename from migrations/Version20240424072545.php
rename to migrations/Version20240426064235.php
index b77fac7d4a2d4974a6e1df1fabf16f7dcd56339e..91425422f152813e43d28978b9bde9a979fdca12 100644
--- a/migrations/Version20240424072545.php
+++ b/migrations/Version20240426064235.php
@@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
 /**
  * Auto-generated Migration: Please modify to your needs!
  */
-final class Version20240424072545 extends AbstractMigration
+final class Version20240426064235 extends AbstractMigration
 {
     public function getDescription(): string
     {
diff --git a/src/Controller/NewsController.php b/src/Controller/NewsController.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae4ea9fd6fe69e57016a7d1d1016abfc2045f2ec
--- /dev/null
+++ b/src/Controller/NewsController.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\Requests\NewsListRequest;
+use Exception;
+use App\Service\NewsService;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Attribute\Route;
+
+#[Route("/api/v1")]
+class NewsController extends AbstractController
+{
+    public function __construct(private NewsService $newsService) {}
+
+    #[Route('/news', name: 'news', methods: ['GET'])]
+    public function news(NewsListRequest $request): Response
+    {
+        $page = $request->getRequest()->query->get('page');
+        $limit = $request->getRequest()->query->get('limit');
+        $newsCategory = $request->getRequest()->query->get('news_category');
+        $news = $this->newsService->getNews($page, $limit, $newsCategory);
+        return $this->json($news);
+    }
+
+    #[Route('/news/mainNews', name: 'mainNews', methods: ['GET'])]
+    public function mainNews(): Response
+    {
+        $mainNews = $this->newsService->getMainNews();
+        return $this->json($mainNews);
+    }
+
+    #[Route('/news/search', name: 'newsSearch', methods: ['GET'])]
+    public function newsSearch(): Response
+    {
+        $newsSearch = $this->newsService->getNewsSearch();
+        return $this->json($newsSearch);
+    }
+
+    #[Route('/news/{newsId}', name: 'newsOne', methods: ['GET'])]
+    public function newsOne(Request $request): Response
+    {
+        try {
+            $newsId = $request->get('newsId');;
+            $news = $this->newsService->getNewsOne($newsId);
+            return $this->json($news);
+        } catch (Exception $e) {
+            return new Response($e->getMessage(), $e->getCode());
+        }
+    }
+}
diff --git a/src/Controller/RestaurantController.php b/src/Controller/RestaurantController.php
index 9f665fca780f9a51c79387eb78f327a4ae7106eb..d6f3983a5b820dcac2ae8a0d6766960b11c4a242 100644
--- a/src/Controller/RestaurantController.php
+++ b/src/Controller/RestaurantController.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace App\Controller;
 
+use App\Requests\RestaurantListRequest;
+use Exception;
 use App\Service\RestaurantService;
 use Nelmio\ApiDocBundle\Annotation\Model;
 use OpenApi\Attributes as OA;
@@ -13,6 +15,7 @@ use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Attribute\Route;
 use App\Model\RestaurantList;
+use Symfony\Component\Serializer\SerializerInterface;
 
 #[Route("/api/v1")]
 class RestaurantController extends AbstractController
@@ -46,12 +49,12 @@ class RestaurantController extends AbstractController
         schema: new Schema(type: "integer")
     )]
     #[Model(type: RestaurantList::class)]
-    public function restaurants(Request $request): Response
+    public function restaurants(RestaurantListRequest $request): Response
     {
-        $page = $request->query->getInt('page');
-        $limit = $request->query->getInt('limit');
-        $restaurantTypeId = $request->query->getInt('restaurant_type_id');
-        $kitchenId = $request->query->getInt('kitchen_id');
+        $page = $request->getRequest()->query->get('page');
+        $limit = $request->getRequest()->query->get('limit');
+        $restaurantTypeId = $request->getRequest()->query->get('restaurant_type_id');
+        $kitchenId = $request->getRequest()->query->get('kitchen_id');
         $restaurantsList = $this->restaurantService->getRestaurants(
             $page, $limit, $restaurantTypeId, $kitchenId
         );
@@ -59,10 +62,19 @@ class RestaurantController extends AbstractController
     }
 
     #[Route('/restaurants/{restaurantId}', name: 'restaurant', methods: ['GET'])]
-    public function restaurant(Request $request): Response
+    public function restaurant(Request $request, SerializerInterface $serializer): Response
     {
-        $restaurantId = (int)$request->get('restaurantId');
-        $restaurant = $this->restaurantService->getRestaurant($restaurantId);
-        return $this->json($restaurant);
+        try {
+            $restaurantId = (int)$request->get('restaurantId');
+            $restaurant = $this->restaurantService->getRestaurant($restaurantId);
+            $json = $serializer->serialize($restaurant, 'json', [
+                'circular_reference_handler' => function ($object) {
+                    return $object->getId();
+                }
+            ]);
+            return new Response($json, Response::HTTP_OK, ['Content-Type' => 'application/json']);
+        } catch (Exception $e) {
+            return new Response($e->getMessage(), $e->getCode());
+        }
     }
 }
diff --git a/src/Entity/News.php b/src/Entity/News.php
index 092b75e84c56c009412e82b9d651ec9970abd10a..3b588b21f2eafd46bbba646fc295672de8e14ad6 100644
--- a/src/Entity/News.php
+++ b/src/Entity/News.php
@@ -53,7 +53,7 @@ class News
     /**
      * @var Collection<int, NewsCategory>
      */
-    #[ORM\ManyToMany(targetEntity: NewsCategory::class)]
+    #[ORM\ManyToMany(targetEntity: NewsCategory::class, inversedBy: "newsCategories")]
     private Collection $newsCategories;
 
     public function __construct()
diff --git a/src/Entity/NewsCategory.php b/src/Entity/NewsCategory.php
index 6190e5881c9b3c589f9482d1f49c388978329adb..fa3a55492700f08705b485bbb9a49668f49065ea 100644
--- a/src/Entity/NewsCategory.php
+++ b/src/Entity/NewsCategory.php
@@ -20,6 +20,9 @@ class NewsCategory
     #[ORM\Column(length: 255)]
     private ?string $code = null;
 
+    #[ORM\ManyToMany(targetEntity: News::class, mappedBy: 'news')]
+    private Collection $news;
+
     public function getId(): ?Uuid
     {
         return $this->id;
diff --git a/src/Entity/Restaurant.php b/src/Entity/Restaurant.php
index 02fd3b1da266a445ee0f69ca4b0ecb8e34528643..a743f1b8a1cf33a9eff9e3da973757d4263c8f5e 100644
--- a/src/Entity/Restaurant.php
+++ b/src/Entity/Restaurant.php
@@ -41,11 +41,11 @@ class Restaurant
     #[ORM\Column(type: Types::ARRAY)]
     private array $coordinates = [];
 
-    #[ORM\ManyToOne(inversedBy: 'restaurants')]
+    #[ORM\ManyToOne(fetch: 'EAGER', inversedBy: 'restaurants')]
     #[ORM\JoinColumn(nullable: false)]
     private ?RestaurantType $typeId = null;
 
-    #[ORM\ManyToOne(inversedBy: 'restaurants')]
+    #[ORM\ManyToOne(fetch: 'EAGER', inversedBy: 'restaurants')]
     #[ORM\JoinColumn(nullable: false)]
     private ?Settlement $settlementId = null;
 
@@ -67,7 +67,7 @@ class Restaurant
     /**
      * @var Collection<int, Phone>
      */
-    #[ORM\OneToMany(targetEntity: Phone::class, mappedBy: 'restaurant')]
+    #[ORM\OneToMany(targetEntity: Phone::class,  mappedBy: 'restaurant')]
     private Collection $phone;
 
     /**
diff --git a/src/Exception/NewsExceptionEnum.php b/src/Exception/NewsExceptionEnum.php
new file mode 100644
index 0000000000000000000000000000000000000000..6535eff9a666bf5cc6b969a9423ef70c94729375
--- /dev/null
+++ b/src/Exception/NewsExceptionEnum.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Exception;
+
+enum NewsExceptionEnum: int
+{
+    case NotFound = 404;
+}
diff --git a/src/Exception/RestaurantExceptionEnum.php b/src/Exception/RestaurantExceptionEnum.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe3469d06cbacd4d4e679201110fffd11772a320
--- /dev/null
+++ b/src/Exception/RestaurantExceptionEnum.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Exception;
+
+enum RestaurantExceptionEnum: int
+{
+    case NotFound = 404;
+}
diff --git a/src/Mapper/NewsMapper.php b/src/Mapper/NewsMapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..65cf34d8d51ef6ad2999f0e60c53b1aecc34c626
--- /dev/null
+++ b/src/Mapper/NewsMapper.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace App\Mapper;
+
+use App\Entity\News;
+use App\Entity\NewsCategory;
+use App\Model\File;
+use App\Model\NewsDetailElement;
+use App\Model\NewsFilterVariants;
+use App\Model\NewsList;
+use App\Model\NewsListingElement;
+use App\Model\NewsCategory as NewsCategoryModel;
+use App\Model\Pagination;
+use Ramsey\Collection\Collection;
+
+class NewsMapper
+{
+    public static function mapToNewsList(
+        $news,
+        $newsCategory,
+        $page,
+        $limit,
+        $count): NewsList
+    {
+        return new NewsList(
+            new Pagination($page, ceil($count / $limit), $limit),
+            new Collection(NewsListingElement::class, array_map(
+                function (News $newsOne) {
+                    return self::mapToListingElement($newsOne);
+                }, $news)
+            ),
+            new NewsFilterVariants(
+                new Collection(NewsCategoryModel::class, array_map(
+                    function (NewsCategory $newsCategoryOne) {
+                        return self::mapToNewsCategory($newsCategoryOne);
+                    }, $newsCategory)
+                )
+            )
+        );
+    }
+
+    public static function mapToListingElement(News $newsOne): NewsListingElement
+    {
+        $file = new File(
+            1,
+            "asd",
+            "Краткое описание",
+            1024,
+            "png",
+            "/upload/asd.png"
+        );
+        return new NewsListingElement(
+            $newsOne->getId(),
+            $newsOne->getPreviewText(),
+            $newsOne->getDetailText(),
+            $file,
+            $newsOne->getCreateAt()->format('d.m.Y'),
+            "/{$newsOne->getCode()}/code/"
+        );
+    }
+
+    public static function mapToDetailElement(News $newsOne): NewsDetailElement
+    {
+        $file = new File(
+            1,
+            "asd",
+            "Краткое описание",
+            1024,
+            "png",
+            "/upload/asd.png"
+        );
+        return new NewsDetailElement(
+            $newsOne->getId(),
+            $newsOne->getPreviewText(),
+            $newsOne->getDetailText(),
+            $newsOne->getDetailText(),
+            $file,
+            $newsOne->getCreateAt()->format('d.m.Y'),
+            "Отель «Арктика»",
+            "otel-arktika",
+            "otel-arktika"
+        );
+    }
+
+    public static function mapToNewsCategory(NewsCategory $newsCategory): NewsCategoryModel
+    {
+        return new NewsCategoryModel(
+            $newsCategory->getId(),
+            $newsCategory->getName(),
+            $newsCategory->getCode(),
+        );
+    }
+}
\ No newline at end of file
diff --git a/src/Mapper/RestaurantMapper.php b/src/Mapper/RestaurantMapper.php
index 5f9b6ae42db0d68d344d5d477a7a028be11be029..62bc18a258b9d68416ec13dbc0ff06bbb46488f7 100644
--- a/src/Mapper/RestaurantMapper.php
+++ b/src/Mapper/RestaurantMapper.php
@@ -11,7 +11,10 @@ use App\Entity\RestaurantType;
 use App\Entity\Tags;
 use App\Model\File;
 use App\Model\KitchenType;
+use App\Model\Pagination;
 use App\Model\RestaurantDetailElement;
+use App\Model\RestaurantFilterVariants;
+use App\Model\RestaurantList;
 use App\Model\RestaurantListingElement;
 use App\Model\RestaurantType as RestaurantTypeModel;
 use App\Model\Tag;
@@ -19,17 +22,46 @@ use Ramsey\Collection\Collection;
 
 class RestaurantMapper
 {
+    public static function mapToRestaurantList(
+        $restaurants,
+        $restaurantTypes,
+        $kitchens,
+        $page,
+        $limit,
+        $count): RestaurantList
+    {
+        return new RestaurantList(
+            new Pagination($page, ceil($count / $limit), $limit),
+            new Collection(RestaurantListingElement::class, array_map(
+                function (Restaurant $restaurant) {
+                    return RestaurantMapper::mapToListElement($restaurant);
+                }, $restaurants)),
+            new RestaurantFilterVariants(
+                new Collection(
+                    RestaurantTypeModel::class, array_map(
+                        function (RestaurantType $restaurantType) {
+                            return RestaurantMapper::mapToRestaurantType($restaurantType);
+                        }, $restaurantTypes
+                    )
+                ),
+                new Collection(
+                    KitchenType::class, array_map(
+                    function (Kitchen $kitchen) {
+                        return RestaurantMapper::mapToKitchenType($kitchen);
+                    }, $kitchens
+                ),
+                )
+            )
+        );
+    }
+
     public static function mapToListElement(Restaurant $restaurant): RestaurantListingElement
     {
         return new RestaurantListingElement(
             $restaurant->getId(),
             $restaurant->getName(),
             $restaurant->getCode(),
-            new RestaurantTypeModel(
-                $restaurant->getTypeId()->getId(),
-                $restaurant->getTypeId()->getName(),
-                $restaurant->getTypeId()->getCode()
-            ),
+            self::mapToRestaurantType($restaurant->getTypeId()),
             $restaurant->getCheckInfo(),
             new File(
                 1,
@@ -58,7 +90,7 @@ class RestaurantMapper
             $restaurant->getName(),
             $restaurant->getCode(),
             implode(',', $restaurant->getCoordinates()),
-            //self::mapToRestaurantType($restaurant->getTypeId()),
+            self::mapToRestaurantType($restaurant->getTypeId()),
             $restaurant->getCheckPrice(),
             $restaurant->getCheckInfo(),
             new Collection(
@@ -67,14 +99,26 @@ class RestaurantMapper
                     return self::mapToKitchenType($kitchen);
                 }, $restaurant->getKitchen()->toArray()),
             ),
-            new Collection(Phone::class, $restaurant->getPhone()->toArray()),
-            new Collection(Email::class, $restaurant->getEmail()->toArray()),
-            new Collection(Address::class, $restaurant->getAddress()->toArray()),
+            new Collection("string", array_map(
+                function (Phone $phone) {
+                    return self::mapToPhone($phone);
+                }, $restaurant->getPhone()->toArray()
+            )),
+            new Collection("string", array_map(
+                function (Email $email) {
+                    return self::mapToEmail($email);
+                }, $restaurant->getEmail()->toArray()
+            )),
+            new Collection("string", array_map(
+                function (Address $address) {
+                    return self::mapToAddress($address);
+                }, $restaurant->getAddress()->toArray()
+            )),
             new Collection(Tag::class, array_map(
                 function (Tags $tag) {
                     return new Tag(
                         "группа тегов 1",
-                        new Collection($tag->getName()),
+                        new Collection("string", [$tag->getName()]),
                     );
                 }, $restaurant->getTags()->toArray()
             )),
@@ -103,4 +147,19 @@ class RestaurantMapper
             $kitchen->getName()
         );
     }
+
+    public static function mapToPhone(Phone $phone): string
+    {
+        return $phone->getName();
+    }
+
+    public static function mapToEmail(Email $email): string
+    {
+        return $email->getName();
+    }
+
+    public static function mapToAddress(Address $address): string
+    {
+        return $address->getName();
+    }
 }
\ No newline at end of file
diff --git a/src/Model/NewsCategory.php b/src/Model/NewsCategory.php
index ba1e1a532f8111b97e6f12f6d8a7a4c12a009a65..e22f4561c4b8cc60edf9ac2ca33bd6813478497c 100644
--- a/src/Model/NewsCategory.php
+++ b/src/Model/NewsCategory.php
@@ -2,21 +2,23 @@
 
 namespace App\Model;
 
+use Symfony\Component\Uid\Uuid;
+
 class NewsCategory
 {
-    private int $id;
+    private Uuid $id;
     private string $name;
     private string $code;
 
 
-    public function __construct(int $id, string $name, string $code)
+    public function __construct(Uuid $id, string $name, string $code)
     {
         $this->id = $id;
         $this->name = $name;
         $this->code = $code;
     }
 
-    public function getId(): int
+    public function getId(): Uuid
     {
         return $this->id;
     }
diff --git a/src/Model/NewsDetailElement.php b/src/Model/NewsDetailElement.php
index 99b345397ff607068894f8315302c752d65c1818..c125aae36ea473d2fc33030e0911719719b9f0c8 100644
--- a/src/Model/NewsDetailElement.php
+++ b/src/Model/NewsDetailElement.php
@@ -2,9 +2,11 @@
 
 namespace App\Model;
 
+use Symfony\Component\Uid\Uuid;
+
 class NewsDetailElement
 {
-    private int $id;
+    private Uuid $id;
     private string $name;
     private string $description;
     private string $text;
@@ -15,7 +17,7 @@ class NewsDetailElement
     private string $seoKeywords;
 
     public function __construct(
-        int    $id,
+        Uuid   $id,
         string $name,
         string $description,
         string $text,
@@ -36,7 +38,7 @@ class NewsDetailElement
         $this->seoKeywords = $seoKeywords;
     }
 
-    public function getId(): int
+    public function getId(): Uuid
     {
         return $this->id;
     }
diff --git a/src/Model/NewsListingElement.php b/src/Model/NewsListingElement.php
index 5134307b16becb13280f8bea38698b15f0def6f7..dd1b0a0a5a87b62434c2dcd2264031dc721da4c5 100644
--- a/src/Model/NewsListingElement.php
+++ b/src/Model/NewsListingElement.php
@@ -2,9 +2,11 @@
 
 namespace App\Model;
 
+use Symfony\Component\Uid\Uuid;
+
 class NewsListingElement
 {
-    private int $id;
+    private Uuid $id;
     private string $name;
     private string $description;
     private File $image;
@@ -12,7 +14,7 @@ class NewsListingElement
     private string $detailLink;
 
     public function __construct(
-        int $id,
+        Uuid $id,
         string $name,
         string $description,
         File $image,
@@ -27,7 +29,7 @@ class NewsListingElement
         $this->detailLink = $detailLink;
     }
 
-    public function getId(): int
+    public function getId(): Uuid
     {
         return $this->id;
     }
diff --git a/src/Model/RestaurantDetailElement.php b/src/Model/RestaurantDetailElement.php
index 01e3e6711119cdcf78631aa5d63af504cc1cd8a1..face2bf58efb0ca8701e45a8bdca5ff1665cf969 100644
--- a/src/Model/RestaurantDetailElement.php
+++ b/src/Model/RestaurantDetailElement.php
@@ -10,7 +10,7 @@ class RestaurantDetailElement
     private string $name;
     private string $code;
     private string $coordinates;
-    //private RestaurantType $type;
+    private RestaurantType $type;
     private string $check;
     private string $checkInfo;
     /**
@@ -48,7 +48,7 @@ class RestaurantDetailElement
         string $name,
         string $code,
         string $coordinates,
-        //RestaurantType $type,
+        RestaurantType $type,
         string $check,
         string $checkInfo,
         Collection $kitchen,
@@ -67,7 +67,7 @@ class RestaurantDetailElement
         $this->name = $name;
         $this->code = $code;
         $this->coordinates = $coordinates;
-        //$this->type = $type;
+        $this->type = $type;
         $this->check = $check;
         $this->checkInfo = $checkInfo;
         $this->kitchen = $kitchen;
@@ -103,10 +103,10 @@ class RestaurantDetailElement
         return $this->coordinates;
     }
 
-//    public function getType(): RestaurantType
-//    {
-//        return $this->type;
-//    }
+    public function getType(): RestaurantType
+    {
+        return $this->type;
+    }
 
     public function getCheck(): string
     {
diff --git a/src/Repository/Interface/NewsCategoryRepositoryInterface.php b/src/Repository/Interface/NewsCategoryRepositoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2d7e4df43599911338cd0150fc04c81e79fa8ae
--- /dev/null
+++ b/src/Repository/Interface/NewsCategoryRepositoryInterface.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Repository\Interface;
+
+interface NewsCategoryRepositoryInterface
+{
+    public function getAll(): array;
+}
\ No newline at end of file
diff --git a/src/Repository/Interface/NewsRepositoryInterface.php b/src/Repository/Interface/NewsRepositoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ad66448531d961c32cba6ded8aa4512b84c3e2e
--- /dev/null
+++ b/src/Repository/Interface/NewsRepositoryInterface.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Repository\Interface;
+
+use App\Entity\News;
+
+interface NewsRepositoryInterface
+{
+    public function getAll(int $page, int $limit, int $newsCategory): array;
+    public function getCount(): int;
+    public function getMainNews(): News;
+    public function getNewsById(string $newsId): News|null;
+}
\ No newline at end of file
diff --git a/src/Repository/Interface/RestaurantRepositoryInterface.php b/src/Repository/Interface/RestaurantRepositoryInterface.php
index 6bffa21c923bf20812078b6158dbd4c1b24f1188..062d71666c291e6da9017f90afa9f17b7dcbd87d 100644
--- a/src/Repository/Interface/RestaurantRepositoryInterface.php
+++ b/src/Repository/Interface/RestaurantRepositoryInterface.php
@@ -6,9 +6,9 @@ use App\Entity\Restaurant;
 
 interface RestaurantRepositoryInterface
 {
-    public function getAll($page, $limit, $restaurantTypeId, $kitchenId): array;
+    public function getAll(int $page, int $limit, int $restaurantTypeId, int $kitchenId): array;
 
     public function getCount(): int;
 
-    public function getById(int $id): Restaurant;
+    public function getById(int $id): Restaurant|null;
 }
\ No newline at end of file
diff --git a/src/Repository/NewsCategoryRepository.php b/src/Repository/NewsCategoryRepository.php
index 3a5eeebb501dc92019e437a531fbe0fcbf9d5093..0b0308be8979130b270c3260180dd5c1f0893d49 100644
--- a/src/Repository/NewsCategoryRepository.php
+++ b/src/Repository/NewsCategoryRepository.php
@@ -3,6 +3,7 @@
 namespace App\Repository;
 
 use App\Entity\NewsCategory;
+use App\Repository\Interface\NewsCategoryRepositoryInterface;
 use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 use Doctrine\Persistence\ManagerRegistry;
 
@@ -14,35 +15,15 @@ use Doctrine\Persistence\ManagerRegistry;
  * @method NewsCategory[]    findAll()
  * @method NewsCategory[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  */
-class NewsCategoryRepository extends ServiceEntityRepository
+class NewsCategoryRepository extends ServiceEntityRepository implements NewsCategoryRepositoryInterface
 {
     public function __construct(ManagerRegistry $registry)
     {
         parent::__construct($registry, NewsCategory::class);
     }
 
-//    /**
-//     * @return NewsCategory[] Returns an array of NewsCategory objects
-//     */
-//    public function findByExampleField($value): array
-//    {
-//        return $this->createQueryBuilder('n')
-//            ->andWhere('n.exampleField = :val')
-//            ->setParameter('val', $value)
-//            ->orderBy('n.id', 'ASC')
-//            ->setMaxResults(10)
-//            ->getQuery()
-//            ->getResult()
-//        ;
-//    }
-
-//    public function findOneBySomeField($value): ?NewsCategory
-//    {
-//        return $this->createQueryBuilder('n')
-//            ->andWhere('n.exampleField = :val')
-//            ->setParameter('val', $value)
-//            ->getQuery()
-//            ->getOneOrNullResult()
-//        ;
-//    }
+    public function getAll(): array
+    {
+        return $this->findAll();
+    }
 }
diff --git a/src/Repository/NewsRepository.php b/src/Repository/NewsRepository.php
index 3b5d8645e9d224f41d8510010eb2ad51d0675722..011be283c22fcfb9b87cee76c26eaa1bf76689df 100644
--- a/src/Repository/NewsRepository.php
+++ b/src/Repository/NewsRepository.php
@@ -2,7 +2,10 @@
 
 namespace App\Repository;
 
+use App\Exception\NewsExceptionEnum;
+use Exception;
 use App\Entity\News;
+use App\Repository\Interface\NewsRepositoryInterface;
 use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
 use Doctrine\Persistence\ManagerRegistry;
 
@@ -14,35 +17,43 @@ use Doctrine\Persistence\ManagerRegistry;
  * @method News[]    findAll()
  * @method News[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  */
-class NewsRepository extends ServiceEntityRepository
+class NewsRepository extends ServiceEntityRepository implements NewsRepositoryInterface
 {
     public function __construct(ManagerRegistry $registry)
     {
         parent::__construct($registry, News::class);
     }
 
-//    /**
-//     * @return News[] Returns an array of News objects
-//     */
-//    public function findByExampleField($value): array
-//    {
-//        return $this->createQueryBuilder('n')
-//            ->andWhere('n.exampleField = :val')
-//            ->setParameter('val', $value)
-//            ->orderBy('n.id', 'ASC')
-//            ->setMaxResults(10)
-//            ->getQuery()
-//            ->getResult()
-//        ;
-//    }
+    public function getAll($page, $limit, $newsCategory): array
+    {
+        $query = $this->getEntityManager()->createQueryBuilder();
+        $query->select('n')->from(News::class, 'n');
+        if ($newsCategory !== null) {
+            $query->join('n.newsCategories', 'nc')
+                ->andWhere('nc.id = :newsCategory')
+                ->setParameter('newsCategory', $newsCategory);
+        }
+        $query->setMaxResults($limit)
+            ->setFirstResult(($page - 1) * $limit);
+        return $query->getQuery()->getResult();
+    }
+
+    public function getCount(): int
+    {
+        return $this->count();
+    }
 
-//    public function findOneBySomeField($value): ?News
-//    {
-//        return $this->createQueryBuilder('n')
-//            ->andWhere('n.exampleField = :val')
-//            ->setParameter('val', $value)
-//            ->getQuery()
-//            ->getOneOrNullResult()
-//        ;
-//    }
+    public function getMainNews(): News
+    {
+        return $this->findOneBy(['mainPageRender' => true]);
+    }
+
+    public function getNewsById(string $newsId): News|null
+    {
+        try {
+            return $this->find(['id' => $newsId]);
+        } catch (Exception $e) {
+            throw new Exception("News not found", NewsExceptionEnum::NotFound->value);
+        }
+    }
 }
diff --git a/src/Repository/RestaurantRepository.php b/src/Repository/RestaurantRepository.php
index 53c05619521538b98d960dfaa865ca45ecfad1ba..0f2061e0f7f844b1e7b836a6af7ad114f5aa1c17 100644
--- a/src/Repository/RestaurantRepository.php
+++ b/src/Repository/RestaurantRepository.php
@@ -26,11 +26,11 @@ class RestaurantRepository extends ServiceEntityRepository implements Restaurant
     {
         $query = $this->createQueryBuilder('r');
         $query->select('r');
-        if ($restaurantTypeId !== 0) {
+        if ($restaurantTypeId !== null) {
             $query->andWhere('r.typeId = :restaurantTypeId')
                 ->setParameter('restaurantTypeId', $restaurantTypeId);
         }
-        if ($kitchenId !== 0) {
+        if ($kitchenId !== null) {
             $query->join('r.kitchen', 'k')
             ->andWhere('k.id = :kitchenId')
                 ->setParameter('kitchenId', $kitchenId);
@@ -45,7 +45,7 @@ class RestaurantRepository extends ServiceEntityRepository implements Restaurant
         return $this->count();
     }
 
-    public function getById(int $id): Restaurant
+    public function getById(int $id): Restaurant|null
     {
         return $this->find($id);
     }
diff --git a/src/Requests/NewsListRequest.php b/src/Requests/NewsListRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..914a3c850b2a166c41cd5bee9fb34e279969ade7
--- /dev/null
+++ b/src/Requests/NewsListRequest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Form\Extension\Core\Type\UuidType;
+use Symfony\Component\Uid\UuidV4;
+use Symfony\Component\Validator\Constraints as Assert;
+
+class NewsListRequest extends BaseRequest
+{
+    #[Assert\Type('int')]
+    #[Assert\NotBlank]
+    public $page;
+    #[Assert\Type('int')]
+    #[Assert\NotBlank]
+    public $limit;
+    #[Assert\Uuid]
+    public $news_category;
+
+    protected function populate(): void
+    {
+        foreach ($this->getRequest()->query as $property => $value) {
+            if (property_exists($this, $property)) {
+                $this->{$property} = ctype_digit($value) ? (int)$value : $value;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Requests/RestaurantListRequest.php b/src/Requests/RestaurantListRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..701674d161f0f08c0275987094c712e3cd222fa4
--- /dev/null
+++ b/src/Requests/RestaurantListRequest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+class RestaurantListRequest extends BaseRequest
+{
+    #[Assert\Type('int')]
+    #[Assert\NotBlank]
+    public $page;
+    #[Assert\Type('int')]
+    #[Assert\NotBlank]
+    public $limit;
+    #[Assert\Type('int')]
+    public $restaurant_type_id;
+    #[Assert\Type('int')]
+    public $kitchen_id;
+
+    protected function populate(): void
+    {
+        foreach ($this->getRequest()->query as $property => $value) {
+            if (property_exists($this, $property)) {
+                $this->{$property} = ctype_digit($value) ? (int)$value : $value;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Service/NewsService.php b/src/Service/NewsService.php
new file mode 100644
index 0000000000000000000000000000000000000000..043d000cb88fe835d2d4ffaf8c6fa3b818704c54
--- /dev/null
+++ b/src/Service/NewsService.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Service;
+
+use Exception;
+use App\Exception\NewsExceptionEnum;
+use App\Mapper\NewsMapper;
+use App\Model\NewsDetailElement;
+use App\Model\NewsList;
+use App\Model\NewsListingElement;
+use App\Repository\Interface\NewsCategoryRepositoryInterface;
+use App\Repository\Interface\NewsRepositoryInterface;
+
+class NewsService
+{
+    public function __construct(
+        private NewsRepositoryInterface $newsRepository,
+        private NewsCategoryRepositoryInterface $newsCategoryRepository) {}
+
+    public function getNews($page, $limit, $newsCategory): NewsList
+    {
+        $news = $this->newsRepository->getAll($page, $limit, $newsCategory);
+        $newsCategories = $this->newsCategoryRepository->getAll();
+        $count = $this->newsRepository->getCount();
+        return NewsMapper::mapToNewsList($news, $newsCategories, $page, $limit, $count);
+    }
+
+    public function getMainNews(): NewsListingElement
+    {
+        $mainNews = $this->newsRepository->getMainNews();
+        return NewsMapper::mapToListingElement($mainNews);
+    }
+
+    public function getNewsSearch(): NewsDetailElement
+    {
+        $mainNews = $this->newsRepository->getMainNews();
+        return NewsMapper::mapToDetailElement($mainNews);
+    }
+
+    public function getNewsOne($newsId): NewsDetailElement
+    {
+        $news = $this->newsRepository->getNewsById($newsId);
+        if ($news == null) {
+            throw new Exception("News not found", NewsExceptionEnum::NotFound->value);
+        }
+        return NewsMapper::mapToDetailElement($news);
+    }
+}
\ No newline at end of file
diff --git a/src/Service/RestaurantService.php b/src/Service/RestaurantService.php
index 7e1866dd93121bb35c6d7e8bdbe7ac3b5e0e8ca6..8f1a42afb0dbfaefddd4c9dfbe5a9ab9d08a9e51 100644
--- a/src/Service/RestaurantService.php
+++ b/src/Service/RestaurantService.php
@@ -2,26 +2,14 @@
 
 namespace App\Service;
 
-use App\Entity\Address;
-use App\Entity\Email;
-use App\Entity\Kitchen;
-use App\Entity\Phone;
-use App\Entity\Restaurant;
-use App\Entity\RestaurantType;
-use App\Entity\Tags;
+use App\Exception\RestaurantExceptionEnum;
+use Exception;
 use App\Mapper\RestaurantMapper;
-use App\Model\File;
-use App\Model\KitchenType;
-use App\Model\Pagination;
 use App\Model\RestaurantDetailElement;
-use App\Model\RestaurantFilterVariants;
 use App\Model\RestaurantList;
-use App\Model\RestaurantListingElement;
-use App\Model\RestaurantType as RestaurantTypeModel;
 use App\Repository\Interface\KitchenRepositoryInterface;
 use App\Repository\Interface\RestaurantRepositoryInterface;
 use App\Repository\Interface\RestaurantTypeRepositoryInterface;
-use Ramsey\Collection\Collection;
 
 class RestaurantService
 {
@@ -45,34 +33,22 @@ class RestaurantService
         $count = $this->restaurantRepository->getCount();
         $restaurantTypes = $this->restaurantTypeRepository->getAll();
         $kitchens = $this->kitchenRepository->getAll();
-        return new RestaurantList(
-            new Pagination($page, ceil($count / $limit), $limit),
-            new Collection(RestaurantListingElement::class, array_map(
-            function (Restaurant $restaurant) {
-                return RestaurantMapper::mapToListElement($restaurant);
-            }, $restaurants)),
-            new RestaurantFilterVariants(
-                new Collection(
-                    RestaurantTypeModel::class, array_map(
-                        function (RestaurantType $restaurantType) {
-                            return RestaurantMapper::mapToRestaurantType($restaurantType);
-                        }, $restaurantTypes
-                    )
-                ),
-                new Collection(
-                    KitchenType::class, array_map(
-                        function (Kitchen $kitchen) {
-                            return RestaurantMapper::mapToKitchenType($kitchen);
-                        }, $kitchens
-                    ),
-                )
-            )
+        return RestaurantMapper::mapToRestaurantList(
+            $restaurants,
+            $restaurantTypes,
+            $kitchens,
+            $page,
+            $limit,
+            $count
         );
     }
 
     public function getRestaurant(int $id): RestaurantDetailElement
     {
         $restaurant = $this->restaurantRepository->getById($id);
+        if ($restaurant == null) {
+            throw new Exception("Restaurant not found", RestaurantExceptionEnum::NotFound->value);
+        }
         return RestaurantMapper::mapToDetailElement($restaurant);
     }
 }
\ No newline at end of file