Index: resTools_backend/backend/Controllers/MenuController.cs
===================================================================
--- resTools_backend/backend/Controllers/MenuController.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Controllers/MenuController.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -35,3 +35,10 @@
         return Ok();
     }
+
+    [HttpPost("{id}/upload")]
+    public async Task<IActionResult> UploadImage(int id, [FromForm] IFormFile file)
+    {
+        await _menuService.UploadImage(id, file);
+        return Ok();
+    }
 }
Index: resTools_backend/backend/Controllers/ReviewsController.cs
===================================================================
--- resTools_backend/backend/Controllers/ReviewsController.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Controllers/ReviewsController.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -12,8 +12,10 @@
     {
         private readonly IReviewService _reviewService = null;
+        private readonly IUserService _userService = null;
 
-        public ReviewsController(IReviewService reviewService)
+        public ReviewsController(IReviewService reviewService, IUserService userService)
         {
             _reviewService = reviewService;
+            _userService = userService;
         }
 
@@ -39,5 +41,12 @@
                 userId = (int)this.HttpContext.Items["User"];
             }
-            catch (Exception ex) { return null; }
+            catch (Exception ex) {
+                var user = await _userService.GetByEmail((string)this.HttpContext.Items["User"]);
+                if (user == null)
+                {
+                    return null;
+                }
+                userId = user.Id;
+            }
             await _reviewService.AddReview(req, userId);
             return Ok();
Index: resTools_backend/backend/Controllers/UsersController.cs
===================================================================
--- resTools_backend/backend/Controllers/UsersController.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Controllers/UsersController.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -39,7 +39,16 @@
         {
             userId = (int)this.HttpContext.Items["User"];
-        }catch (Exception ex){ return null; }
+        }
+        catch (Exception ex)
+        {
+            var usr = await _userService.GetByEmail((string)this.HttpContext.Items["User"]);
+            if(usr == null)
+            {
+                return null;
+            }
+            userId = usr.Id;
+        }
         User user = await _userService.GetById(userId);
-        return new AuthenticateResponse() { Email=user.Email, Id = user.Id, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed};
+        return new AuthenticateResponse() { Email=user.Email, Id = user.Id, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed, isVip = user.IsVip};
     }
 
@@ -93,3 +102,17 @@
         return response;
     }
+
+    [Authorize]
+    [HttpGet()]
+    public async Task<List<UserResponse>> GetUsers()
+    {
+        return await _userService.GetUsers();
+    }
+
+    [Authorize]
+    [HttpPost("{id}/vip")]
+    public async Task UpdateVip(int id, bool newStatus)
+    {
+        await _userService.UpdateVipStatus(id,newStatus);
+    }
 }
Index: resTools_backend/backend/DTOs/AuthenticateResponse.cs
===================================================================
--- resTools_backend/backend/DTOs/AuthenticateResponse.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/DTOs/AuthenticateResponse.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -17,3 +17,5 @@
     [JsonProperty]
     public bool IsConfirmed { get; set; }
+    [JsonProperty]
+    public bool isVip { get; set; }
 }
Index: resTools_backend/backend/DTOs/CreateMenuItemRequest.cs
===================================================================
--- resTools_backend/backend/DTOs/CreateMenuItemRequest.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/DTOs/CreateMenuItemRequest.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -11,4 +11,8 @@
         [JsonProperty]
         public int Price { get; set; }
+        [JsonProperty]
+        public bool IsVipOnly { get; set; }
+        [JsonProperty]
+        public string Alergens { get; set; }
     }
 }
Index: resTools_backend/backend/DTOs/CreateUserRequest.cs
===================================================================
--- resTools_backend/backend/DTOs/CreateUserRequest.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/DTOs/CreateUserRequest.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -10,4 +10,7 @@
         [JsonProperty]
         public string Password { get; set; }
+
+        [JsonProperty]
+        public bool IsConfirmed { get; set; }
     }
 }
Index: resTools_backend/backend/DTOs/MenuItemResponse.cs
===================================================================
--- resTools_backend/backend/DTOs/MenuItemResponse.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/DTOs/MenuItemResponse.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -13,4 +13,10 @@
         [JsonProperty]
         public int Price { get; set; }
+        [JsonProperty]
+        public bool IsVipOnly { get; set; }
+        [JsonProperty]
+        public string Alergens { get; set; }
+        [JsonProperty]
+        public string Image { get; set; }
     }
 }
Index: resTools_backend/backend/DTOs/UserResponse.cs
===================================================================
--- resTools_backend/backend/DTOs/UserResponse.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/DTOs/UserResponse.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,9 @@
+﻿namespace backend.DTOs
+{
+    public class UserResponse
+    {
+        public int Id { get; set; }
+        public string Email { get; set; }
+        public bool IsVip { get; set; }
+    }
+}
Index: resTools_backend/backend/Data/DataContext.cs
===================================================================
--- resTools_backend/backend/Data/DataContext.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Data/DataContext.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -94,4 +94,18 @@
         }
 
+        private DbSet<QueueItem> queueItems;
+        public DbSet<QueueItem> QueueItems
+        {
+            get
+            {
+                if (queueItems == null)
+                {
+                    queueItems = Set<QueueItem>();
+                }
+
+                return queueItems;
+            }
+        }
+
 
         protected override void OnModelCreating(ModelBuilder modelBuilder)
@@ -152,4 +166,6 @@
             modelBuilder.Entity<ToDoItem>()
             .HasOne(p => p.LinkedReview);
+
+            modelBuilder.Entity<QueueItem>().Property(x => x.Id).IsRequired().ValueGeneratedOnAdd();
         }
     }
Index: resTools_backend/backend/Email/EmailSender.cs
===================================================================
--- resTools_backend/backend/Email/EmailSender.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Email/EmailSender.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -1,3 +1,5 @@
-﻿using SendGrid;
+﻿using backend.Data;
+using backend.Entities;
+using SendGrid;
 using SendGrid.Helpers.Mail;
 
@@ -9,17 +11,23 @@
 public class EmailSender : IEmailSender
 {
+
+    private readonly DataContext _context = null;
+    public EmailSender(DataContext context)
+    {
+        _context = context;
+    }
+
     public async Task SendEmailAsync(string subject, string message, string toEmail)
     {
-        var client = new SendGridClient("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");
-        var msg = new SendGridMessage()
+
+        _context.QueueItems.Add(new QueueItem()
         {
-            From = new EmailAddress("danilo.najkov@students.finki.ukim.mk", "Danilo"),
             Subject = subject,
-            PlainTextContent = message,
-            HtmlContent = message
-        };
-        msg.AddTo(new EmailAddress(toEmail));
-        msg.SetClickTracking(false, false);
-        var response = await client.SendEmailAsync(msg);
+            Message = message,
+            Reciptient = toEmail,
+            CreatedAt = DateTime.UtcNow,
+            Retries = 0
+        });
+        await _context.SaveChangesAsync();
     }
 }
Index: resTools_backend/backend/Entities/MenuItem.cs
===================================================================
--- resTools_backend/backend/Entities/MenuItem.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Entities/MenuItem.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -7,4 +7,7 @@
         public string Description { get; set; }
         public int Price { get; set; }
+        public byte[] Image { get; set; }
+        public bool IsVipOnly { get; set; }
+        public string Alergens { get; set; }
         public virtual Restaurant Restaurant { get; set; }
     }
Index: resTools_backend/backend/Entities/QueueItem.cs
===================================================================
--- resTools_backend/backend/Entities/QueueItem.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Entities/QueueItem.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,14 @@
+﻿using SendGrid.Helpers.Mail;
+
+namespace backend.Entities
+{
+    public class QueueItem
+    {
+        public int Id { get; set; }
+        public string Subject { get; set; }
+        public string Message { get; set; }
+        public string Reciptient { get; set; }
+        public DateTime CreatedAt { get; set; }
+        public int Retries { get; set; }
+    }
+}
Index: resTools_backend/backend/Entities/User.cs
===================================================================
--- resTools_backend/backend/Entities/User.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Entities/User.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -10,4 +10,5 @@
     public bool IsAdmin { get; set; }
     public bool IsConfirmed { get; set; }
+    public bool IsVip { get; set; }
     public string? ConfirmationURL { get; set; }
     public DateTime? ConfirmationValidTo { get; set; }
Index: resTools_backend/backend/Helpers/JwtMiddleware.cs
===================================================================
--- resTools_backend/backend/Helpers/JwtMiddleware.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Helpers/JwtMiddleware.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -6,4 +6,7 @@
 using backend.Services;
 using backend.Helpers;
+using Google.Apis.Auth;
+using System.Text.Json;
+using Newtonsoft.Json;
 
 public class JwtMiddleware
@@ -11,4 +14,6 @@
     private readonly RequestDelegate _next;
     private readonly AppSettings _appSettings;
+    private static readonly HttpClient client = new HttpClient();
+
 
     public JwtMiddleware(RequestDelegate next, IOptions<AppSettings> appSettings)
@@ -22,14 +27,21 @@
         var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
 
-        if (token != null)
-            attachUserToContext(context, userService, token);
+        if (token != null && token != "null")
+            await attachUserToContext(context, userService, token);
 
         await _next(context);
     }
 
-    private void attachUserToContext(HttpContext context, IUserService userService, string token)
+    private async Task attachUserToContext(HttpContext context, IUserService userService, string token)
     {
         try
         {
+            var fbResult = await this.ValidateFacebookToken(token);
+            if (fbResult != null)
+            {
+                context.Items["User"] = fbResult;
+                return;
+            }
+
             var tokenHandler = new JwtSecurityTokenHandler();
             var key = System.Text.Encoding.ASCII.GetBytes(_appSettings.Secret);
@@ -47,9 +59,38 @@
 
             context.Items["User"] = userId;
+
         }
         catch
         {
-            // do nothing if jwt validation fails
+            try
+            {
+                var result = await GoogleJsonWebSignature.ValidateAsync(token);
+                context.Items["User"] = result.Email;
+            }
+            catch
+            {
+                // do nothing
+            }
         }
     }
+
+    private async Task<string> ValidateFacebookToken(string token)
+    {
+        try
+        {
+            var stringTask = await client.GetStringAsync("https://graph.facebook.com/me?fields=email&access_token=" + token);
+            var obj = JsonConvert.DeserializeObject<FacebookResult>(stringTask);
+            return obj.email;
+        }
+        catch
+        {
+            return null;
+        }
+    }
+
+    internal class FacebookResult
+    {
+        public string email { get; set; }
+        public string id { get; set; }
+    }
 }
Index: resTools_backend/backend/Jobs/QueueJob.cs
===================================================================
--- resTools_backend/backend/Jobs/QueueJob.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Jobs/QueueJob.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,57 @@
+﻿using backend.Data;
+using Microsoft.EntityFrameworkCore;
+using Quartz;
+using SendGrid;
+using SendGrid.Helpers.Mail;
+
+namespace backend.Jobs
+{
+    public class QueueJob : IJob
+    {
+        private readonly DataContext _context = null;
+        public QueueJob(DataContext context)
+        {
+            _context = context;
+        }
+        public async Task Execute(IJobExecutionContext context)
+        {
+            var items = await _context.QueueItems.OrderBy(x => x.CreatedAt).Take(10).ToListAsync();
+            var client = new SendGridClient("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");
+            foreach(var item in items)
+            {
+                var msg = new SendGridMessage()
+                {
+                    From = new EmailAddress("danilo.najkov@students.finki.ukim.mk",
+                                            "Danilo"),
+                    Subject = item.Subject,
+                    HtmlContent = item.Message
+                };
+                msg.AddTo(new EmailAddress(item.Reciptient));
+                msg.SetClickTracking(false, false);
+
+                var response = await client.SendEmailAsync(msg);
+                if (response.IsSuccessStatusCode)
+                {
+                    _context.QueueItems.Remove(item);
+                }
+                else if (item.Retries == 2)
+                {
+                    _context.QueueItems.Add(new Entities.QueueItem()
+                    { 
+                        CreatedAt=DateTime.UtcNow, 
+                        Subject="Неуспешно испратена порака",
+                        Message="Порака: "+item.Subject+", до "+item.Reciptient+" беше неуспешно пратена.",
+                        Retries=0
+                    });
+                    _context.QueueItems.Remove(item);
+                }
+                else
+                {
+                    item.Retries++;
+                    _context.QueueItems.Update(item);
+                }
+            }
+            await _context.SaveChangesAsync();
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220915165432_CronJobs.Designer.cs
===================================================================
--- resTools_backend/backend/Migrations/20220915165432_CronJobs.Designer.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Migrations/20220915165432_CronJobs.Designer.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,353 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using backend.Data;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    [DbContext(typeof(DataContext))]
+    [Migration("20220915165432_CronJobs")]
+    partial class CronJobs
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "6.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("MenuItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.QueueItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Reciptient")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Retries")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("QueueItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ContactName")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("ContactNumber")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Persons")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationPlace")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationStatus")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationType")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<int>("Table")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("Reservations");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("OwnerFk")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Phone")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerFk")
+                        .IsUnique();
+
+                    b.ToTable("Restoraunts");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Stars")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.ToDoItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("LinkedReviewId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Priority")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("LinkedReviewId");
+
+                    b.ToTable("ToDoItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ConfirmationURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("ConfirmationValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("PasswordResetURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("PasswordResetValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Menu")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reservations")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.HasOne("backend.Entities.User", "Owner")
+                        .WithOne("Restaurant")
+                        .HasForeignKey("backend.Entities.Restaurant", "OwnerFk");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reviews")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("backend.Entities.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("backend.Entities.ToDoItem", b =>
+                {
+                    b.HasOne("backend.Entities.Review", "LinkedReview")
+                        .WithMany()
+                        .HasForeignKey("LinkedReviewId");
+
+                    b.Navigation("LinkedReview");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Navigation("Menu");
+
+                    b.Navigation("Reservations");
+
+                    b.Navigation("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Navigation("Restaurant")
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220915165432_CronJobs.cs
===================================================================
--- resTools_backend/backend/Migrations/20220915165432_CronJobs.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Migrations/20220915165432_CronJobs.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,37 @@
+﻿using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    public partial class CronJobs : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "QueueItems",
+                columns: table => new
+                {
+                    Id = table.Column<int>(type: "integer", nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    Subject = table.Column<string>(type: "text", nullable: false),
+                    Message = table.Column<string>(type: "text", nullable: false),
+                    Reciptient = table.Column<string>(type: "text", nullable: false),
+                    CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
+                    Retries = table.Column<int>(type: "integer", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_QueueItems", x => x.Id);
+                });
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "QueueItems");
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.Designer.cs
===================================================================
--- resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.Designer.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.Designer.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,367 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using backend.Data;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    [DbContext(typeof(DataContext))]
+    [Migration("20220918134340_MenuUpdatesAndVIP")]
+    partial class MenuUpdatesAndVIP
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "6.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Alergens")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<bool>("IsVipOnly")
+                        .HasColumnType("boolean");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("MenuItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.QueueItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Reciptient")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Retries")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("QueueItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ContactName")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("ContactNumber")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Persons")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationPlace")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationStatus")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("ReservationType")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<int>("Table")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.ToTable("Reservations");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("Address")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("OwnerFk")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Phone")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerFk")
+                        .IsUnique();
+
+                    b.ToTable("Restoraunts");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("RestaurantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Stars")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RestaurantId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.ToDoItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int?>("LinkedReviewId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Priority")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("LinkedReviewId");
+
+                    b.ToTable("ToDoItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ConfirmationURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("ConfirmationValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsVip")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("PasswordResetURL")
+                        .HasColumnType("text");
+
+                    b.Property<DateTime?>("PasswordResetValidTo")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("backend.Entities.MenuItem", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Menu")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Reservation", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reservations")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.HasOne("backend.Entities.User", "Owner")
+                        .WithOne("Restaurant")
+                        .HasForeignKey("backend.Entities.Restaurant", "OwnerFk");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("backend.Entities.Review", b =>
+                {
+                    b.HasOne("backend.Entities.Restaurant", "Restaurant")
+                        .WithMany("Reviews")
+                        .HasForeignKey("RestaurantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("backend.Entities.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Restaurant");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("backend.Entities.ToDoItem", b =>
+                {
+                    b.HasOne("backend.Entities.Review", "LinkedReview")
+                        .WithMany()
+                        .HasForeignKey("LinkedReviewId");
+
+                    b.Navigation("LinkedReview");
+                });
+
+            modelBuilder.Entity("backend.Entities.Restaurant", b =>
+                {
+                    b.Navigation("Menu");
+
+                    b.Navigation("Reservations");
+
+                    b.Navigation("Reviews");
+                });
+
+            modelBuilder.Entity("backend.Entities.User", b =>
+                {
+                    b.Navigation("Restaurant")
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.cs
===================================================================
--- resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ resTools_backend/backend/Migrations/20220918134340_MenuUpdatesAndVIP.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,60 @@
+﻿using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace backend.Migrations
+{
+    public partial class MenuUpdatesAndVIP : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<bool>(
+                name: "IsVip",
+                table: "Users",
+                type: "boolean",
+                nullable: false,
+                defaultValue: false);
+
+            migrationBuilder.AddColumn<string>(
+                name: "Alergens",
+                table: "MenuItems",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+
+            migrationBuilder.AddColumn<byte[]>(
+                name: "Image",
+                table: "MenuItems",
+                type: "bytea",
+                nullable: false,
+                defaultValue: new byte[0]);
+
+            migrationBuilder.AddColumn<bool>(
+                name: "IsVipOnly",
+                table: "MenuItems",
+                type: "boolean",
+                nullable: false,
+                defaultValue: false);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "IsVip",
+                table: "Users");
+
+            migrationBuilder.DropColumn(
+                name: "Alergens",
+                table: "MenuItems");
+
+            migrationBuilder.DropColumn(
+                name: "Image",
+                table: "MenuItems");
+
+            migrationBuilder.DropColumn(
+                name: "IsVipOnly",
+                table: "MenuItems");
+        }
+    }
+}
Index: resTools_backend/backend/Migrations/DataContextModelSnapshot.cs
===================================================================
--- resTools_backend/backend/Migrations/DataContextModelSnapshot.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Migrations/DataContextModelSnapshot.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -31,8 +31,19 @@
                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 
+                    b.Property<string>("Alergens")
+                        .IsRequired()
+                        .HasColumnType("text");
+
                     b.Property<string>("Description")
                         .IsRequired()
                         .HasColumnType("text");
 
+                    b.Property<byte[]>("Image")
+                        .IsRequired()
+                        .HasColumnType("bytea");
+
+                    b.Property<bool>("IsVipOnly")
+                        .HasColumnType("boolean");
+
                     b.Property<int>("Price")
                         .HasColumnType("integer");
@@ -50,4 +61,35 @@
 
                     b.ToTable("MenuItems");
+                });
+
+            modelBuilder.Entity("backend.Entities.QueueItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Reciptient")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Retries")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("QueueItems");
                 });
 
@@ -225,4 +267,7 @@
 
                     b.Property<bool>("IsConfirmed")
+                        .HasColumnType("boolean");
+
+                    b.Property<bool>("IsVip")
                         .HasColumnType("boolean");
 
Index: resTools_backend/backend/Program.cs
===================================================================
--- resTools_backend/backend/Program.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Program.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -2,7 +2,9 @@
 using backend.Email;
 using backend.Helpers;
+using backend.Jobs;
 using backend.Services;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.OpenApi.Models;
+using Quartz;
 using WebApi.Helpers;
 
@@ -56,4 +58,19 @@
 builder.Services.AddDbContext<DataContext>(p => p.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
 
+builder.Services.AddQuartz(q =>
+{
+    q.UseMicrosoftDependencyInjectionScopedJobFactory();
+    var jobKey = new JobKey("QueueJob");
+    q.AddJob<QueueJob>(opts => opts.WithIdentity(jobKey));
+
+    q.AddTrigger(opts => opts
+        .ForJob(jobKey)
+        .WithIdentity("QueueJob-trigger")
+        .WithCronSchedule("0 0/1 * * * ?"));
+
+});
+
+IServiceCollection serviceCollection = builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
+
 var app = builder.Build();
 
Index: resTools_backend/backend/Services/MenuService.cs
===================================================================
--- resTools_backend/backend/Services/MenuService.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Services/MenuService.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -10,4 +10,5 @@
         public Task AddMenu(CreateMenuItemRequest menu);
         public Task RemoveMenu(int id);
+        public Task UploadImage(int id, IFormFile file);
     }
     public class MenuService : IMenuService
@@ -29,6 +30,9 @@
                 Title = menu.Title,
                 Description = menu.Description,
-                Price = menu.Price
-            });
+                Price = menu.Price,
+                Alergens = menu.Alergens,
+                IsVipOnly = menu.IsVipOnly,
+                Image = Array.Empty<byte>()
+            }) ;
             _context.Restoraunts.Update(res);
             await _context.SaveChangesAsync();
@@ -42,4 +46,16 @@
             await _context.SaveChangesAsync();
         }
+
+        public async Task UploadImage(int id, IFormFile file)
+        {
+            using (var memoryStream = new MemoryStream())
+            {
+                await file.CopyToAsync(memoryStream);
+                var menuItem = await _context.MenuItems.FindAsync(id);
+                menuItem.Image = memoryStream.ToArray();
+                _context.MenuItems.Update(menuItem);
+                _context.SaveChanges();
+            }
+        }
     }
 }
Index: resTools_backend/backend/Services/RestaurantService.cs
===================================================================
--- resTools_backend/backend/Services/RestaurantService.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Services/RestaurantService.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -45,5 +45,8 @@
                         Title = x.Title,
                         Description = x.Description,
-                        Price = x.Price
+                        Price = x.Price,
+                        Alergens = x.Alergens,
+                        Image = String.Format("data:image/png;base64,{0}", Convert.ToBase64String(x.Image)),
+                        IsVipOnly = x.IsVipOnly
                     }).ToList(),
                     Reviews = x.Reviews.Select(x => new ReviewResponse()
@@ -55,8 +58,9 @@
                         Title = x.Title,
                         Username = x.User == null ? "Anonymous" : x.User.Email
-                    }).ToList(),
-                    AverageReview = x.Reviews.Count>0 ? x.Reviews.Select(x => x.Stars).Average() : 0
+                    }).ToList()
                 })
                 .FirstOrDefaultAsync();
+            var reviews = await _context.Reviews.ToListAsync();
+            res.AverageReview = reviews.Select(x => x.Stars).Sum();
             return res;
         }
Index: resTools_backend/backend/Services/ReviewService.cs
===================================================================
--- resTools_backend/backend/Services/ReviewService.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Services/ReviewService.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -1,4 +1,5 @@
 ﻿using backend.Data;
 using backend.DTOs;
+using backend.Email;
 using backend.Entities;
 using Microsoft.EntityFrameworkCore;
@@ -15,8 +16,11 @@
     {
         private readonly DataContext _context = null;
+        private readonly IEmailSender _emailSender;
 
-        public ReviewService(DataContext context)
+        public ReviewService(DataContext context, IEmailSender emailSender)
         {
             _context = context;
+            _emailSender = emailSender;
+
         }
 
@@ -39,4 +43,10 @@
             _context.Restoraunts.Update(res);
             await _context.SaveChangesAsync();
+
+            if (review.Stars < 3)
+            {
+                var adminUser = await _context.Users.FirstOrDefaultAsync(x => x.IsAdmin);
+                await _emailSender.SendEmailAsync("Добивте лоша оценка", $"<html><h1>{review.Title}</h1><p>{review.Description}</p></html>", adminUser.Email);
+            }
         }
 
Index: resTools_backend/backend/Services/UserService.cs
===================================================================
--- resTools_backend/backend/Services/UserService.cs	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/Services/UserService.cs	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -20,8 +20,12 @@
     Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst);
     Task<User> GetById(int id);
+    Task<User> GetByEmail(string email);
     Task SendEmailConfirmation(string email);
     Task SendPasswordReset(string email);
     Task ConfirmEmail(User user, string checkValid);
     Task ResetPassword(string checkValid, string password);
+    Task<List<UserResponse>> GetUsers();
+    Task UpdateVipStatus(int id, bool isVip);
+
 }
 
@@ -39,4 +43,9 @@
     }
 
+    public async Task<User> GetByEmail(string email)
+    {
+        return await _context.Users.FirstOrDefaultAsync(x => x.Email == email);
+    }
+
     public async Task<AuthenticateResponse> Authenticate(AuthenticateRequest model)
     {
@@ -49,5 +58,5 @@
         var token = generateJwtToken(user);
 
-        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed};
+        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = user.IsConfirmed, isVip = user.IsVip};
     }
 
@@ -75,9 +84,14 @@
     public async Task<AuthenticateResponse> Register(CreateUserRequest req, bool isFirst)
     {
-        User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst, IsConfirmed = false };
+        var exists = await _context.Users.FirstOrDefaultAsync(x => x.Email == req.Email);
+        if(exists != null && req.IsConfirmed)
+        {
+            return new AuthenticateResponse { Email = exists.Email, Id = exists.Id, IsAdmin = exists.IsAdmin, IsConfirmed = true };
+        }
+        User user = new User() { Email = req.Email, Password = req.Password, IsAdmin = isFirst, IsConfirmed = req.IsConfirmed, IsVip = false };
         await _context.Users.AddAsync(user);
         await _context.SaveChangesAsync();
         var token = generateJwtToken(user);
-        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = false };
+        return new AuthenticateResponse { Email = user.Email, Id = user.Id, Token = token, IsAdmin = user.IsAdmin, IsConfirmed = req.IsConfirmed, isVip = user.IsVip };
     }
 
@@ -125,4 +139,22 @@
     }
 
+    public async Task<List<UserResponse>> GetUsers()
+    {
+        return await _context.Users.Select(x => new UserResponse()
+        {
+            Email = x.Email,
+            Id = x.Id,
+            IsVip = x.IsVip
+        }).OrderBy(x => x.Id).ToListAsync();
+    }
+
+    public async Task UpdateVipStatus(int id, bool isVip)
+    {
+        var user = await _context.Users.FindAsync(id);
+        user.IsVip = isVip;
+        _context.Users.Update(user);
+        await _context.SaveChangesAsync();
+    }
+
     private string generateJwtToken(User user)
     {
Index: resTools_backend/backend/backend.csproj
===================================================================
--- resTools_backend/backend/backend.csproj	(revision 63f5ced9a67981fef890f7b0b5562b67d534f709)
+++ resTools_backend/backend/backend.csproj	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -12,4 +12,6 @@
 
   <ItemGroup>
+    <PackageReference Include="Google.Apis.Auth" Version="1.57.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="6.0.9" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.3" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.3" />
@@ -22,4 +24,6 @@
     <PackageReference Include="Npgsql" Version="6.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
+    <PackageReference Include="Quartz" Version="3.4.0" />
+    <PackageReference Include="Quartz.Extensions.Hosting" Version="3.4.0" />
     <PackageReference Include="SendGrid" Version="9.28.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
