Index: frontend/src/App.js
===================================================================
--- frontend/src/App.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/App.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -3,4 +3,5 @@
 import axios from 'axios'
 import env from './env'
+import { gapi } from 'gapi-script';
 
 import {Spin} from "antd";
@@ -18,4 +19,5 @@
 import Reset from "./Auth/Reset";
 import ToDo from "./Dashboard/ToDo";
+import Vip from "./Dashboard/Vip";
 
 
@@ -26,4 +28,11 @@
     getUser()
   },[])
+
+  gapi.load('client:auth2', () => {
+    gapi.client.init({
+      clientId: '748923557453-ljii8ulhti93man769d2dd9soi7038j5.apps.googleusercontent.com',
+      plugin_name: 'chat'
+    });
+  });
 
   const getUser = () => {
@@ -50,4 +59,5 @@
               <Route path="/dashboard/reviews" element={<Review/>}/>
               <Route path="/dashboard/todo" element={<ToDo/>}/>
+              <Route path="/dashboard/vip" element={<Vip/>}/>
             </Route>
             <Route path="/login" element={loading ? <Spin /> :  !user ? <Login setUser={setUser}/> :  <Navigate to="/dashboard" replace={true} />}/>
Index: frontend/src/Auth/auth.js
===================================================================
--- frontend/src/Auth/auth.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/Auth/auth.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -6,4 +6,6 @@
 import '../App.css'
 import env from "../env";
+import { GoogleLogin } from 'react-google-login';
+import FacebookLogin from 'react-facebook-login';
 
 const setAuthCookie = (token) => {
@@ -29,4 +31,27 @@
             });
             setLoading(false)
+        })
+    }
+
+    const googleLoginResponse = (response)=>{
+        console.log(response)
+        setLoading(true)
+        console.log(response.tokenId)
+        setAuthCookie('Bearer '+response.tokenId)
+        axios.post(env.api+'Users/register',{email: response.profileObj.email, password:'', isConfirmed: true}).then(res => {
+            setUser(res.data)
+            setLoading(false)
+            history(res.data.isAdmin ? '/dashboard' : '/')
+        })
+    }
+
+    const facebookLoginResponse = (response) =>{
+        console.log(response)
+        setLoading(true)
+        setAuthCookie('Bearer '+response.accessToken)
+        axios.post(env.api+'Users/register',{email: response.email, password:'', isConfirmed: true}).then(res => {
+            setUser(res.data)
+            setLoading(false)
+            history(res.data.isAdmin ? '/dashboard' : '/')
         })
     }
@@ -73,7 +98,20 @@
 
                         <Form.Item style={{margin:'0px'}}>
-                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading}>
+                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading} style={{marginBottom:'5px'}}>
                                 Log in
                             </Button>
+                            <br/>
+                            <GoogleLogin
+                                clientId="748923557453-ljii8ulhti93man769d2dd9soi7038j5.apps.googleusercontent.com"
+                                buttonText="Логирај се со Google"
+                                onSuccess={googleLoginResponse}
+                            />
+                            <FacebookLogin
+                                appId="1455131645009417"
+                                size={'small'}
+                                textButton={'Логирај се со FB'}
+                                icon="fa-facebook"
+                                fields="name,email"
+                                callback={facebookLoginResponse} />
                             <div>
                                 Или <a href={"/register"}>регистрирај се!</a>
@@ -102,5 +140,5 @@
         }
         setLoading(true)
-        axios.post(env.api+'Users/register',{email: attr.email, password: attr.password}).then(res => {
+        axios.post(env.api+'Users/register',{email: attr.email, password: attr.password,isConfirmed:false}).then(res => {
             setAuthCookie(res.data.token)
             setUser(res.data)
@@ -109,4 +147,29 @@
         })
     }
+
+    const googleLoginResponse = (response)=>{
+        console.log(response)
+        setLoading(true)
+        console.log(response.tokenId)
+        setAuthCookie('Bearer '+response.tokenId)
+        axios.post(env.api+'Users/register',{email: response.profileObj.email, password:'', isConfirmed: true}).then(res => {
+            setUser(res.data)
+            setLoading(false)
+            history('/')
+        })
+    }
+
+    const facebookLoginResponse = (response) =>{
+        console.log(response)
+        setLoading(true)
+        setAuthCookie('Bearer '+response.accessToken)
+        axios.post(env.api+'Users/register',{email: response.email, password:'', isConfirmed: true}).then(res => {
+            setUser(res.data)
+            setLoading(false)
+            history('/')
+        })
+    }
+
+
     return(
         <div style={{width:'100vw',height:'100vh', textAlign:'center', backgroundColor:'#F2F2F2'}}>
@@ -165,7 +228,21 @@
 
                         <Form.Item style={{margin:'0px'}}>
-                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading}>
+                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading} style={{marginBottom:'5px'}}>
                                 Register
                             </Button>
+                            <br/>
+                            <GoogleLogin
+                                clientId="748923557453-ljii8ulhti93man769d2dd9soi7038j5.apps.googleusercontent.com"
+                                buttonText="Регистрирај се со Google"
+                                onSuccess={googleLoginResponse}
+                            />
+                            <div style={{margin:'5px'}}/>
+                            <FacebookLogin
+                                appId="1455131645009417"
+                                size={'small'}
+                                textButton={'Регистрирај се со FB'}
+                                icon="fa-facebook"
+                                fields="name,email"
+                                callback={facebookLoginResponse} />
                             <div>
                                 Или <a href={"/login"}>најави се!</a>
Index: frontend/src/Dashboard.js
===================================================================
--- frontend/src/Dashboard.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/Dashboard.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -3,5 +3,11 @@
 import {Link, useNavigate} from "react-router-dom";
 import {Outlet} from "react-router";
-import {BookOutlined, BulbOutlined, ContainerOutlined, QuestionCircleOutlined, UserOutlined} from "@ant-design/icons";
+import {
+    BookOutlined,
+    BulbOutlined,
+    ContainerOutlined,
+    QuestionCircleOutlined, StarOutlined,
+    UserOutlined
+} from "@ant-design/icons";
 import * as PropTypes from "prop-types";
 import {Header} from "./Header";
@@ -30,4 +36,5 @@
                         to="/dashboard/reviews">Оценки</Link></Menu.Item>
                     <Menu.Item key="5" icon={<BookOutlined/>}><Link to="/dashboard/todo">ToDo</Link></Menu.Item>
+                    <Menu.Item key="6" icon={<StarOutlined />}><Link to="/dashboard/vip">VIP</Link></Menu.Item>
                 </Menu>
             </div>
Index: frontend/src/Dashboard/Menu.js
===================================================================
--- frontend/src/Dashboard/Menu.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/Dashboard/Menu.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -1,6 +1,7 @@
 import React, {useEffect, useState} from 'react'
-import {Button, Form, Input, Card, notification} from "antd";
+import {Button, Form, Input, Card, notification, Checkbox, message, Upload} from "antd";
 import axios from "axios";
 import env from "../env";
+import {PlusOutlined} from "@ant-design/icons";
 
 const Menu = props => {
@@ -23,6 +24,21 @@
     }
 
+    const beforeUpload = (file) => {
+        const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
+        if (!isJpgOrPng) {
+            message.error('Сликата мора да е формат jpg или png');
+        }
+        if(isJpgOrPng) setLoadingSave(true);
+        return isJpgOrPng;
+    }
+    const uploadChanged = (ev) =>{
+        if(ev.file.status == 'done'){
+            getRestaurant()
+        }
+    }
+
     const addMenu = (data) => {
         setLoadingSave(true);
+        console.log(data)
         axios.post(env.api + 'Menu/',{...data,price: parseInt(data.price)}, { headers: {Authorization: localStorage.getItem('Auth')}
         }).then(res => {
@@ -97,4 +113,10 @@
                     </Form.Item>
                     <Form.Item
+                        label="Алергени"
+                        name="alergens"
+                    >
+                        <Input/>
+                    </Form.Item>
+                    <Form.Item
                         label="Цена"
                         name="price"
@@ -109,4 +131,10 @@
                         <Input placeholder="Цена" type={'number'}/>
                     </Form.Item>
+                    <Form.Item
+                        name="isVipOnly"
+                        valuePropName="checked"
+                    >
+                        <Checkbox>Само за VIP</Checkbox>
+                    </Form.Item>
                     <Form.Item style={{textAlign: 'center'}}>
                         <Button type="primary" htmlType="submit" loading={loadingSave}>
@@ -118,6 +146,20 @@
             <div style={{textAlign:'start'}}>
                 {restaurant.menu.map(el =>
-                    <Card title={el.title} extra={<p style={{color:'red',cursor:'pointer'}} onClick={()=>deleteMenu(el.id)}>Избриши</p>} style={{ width: 300, display:'inline-block', margin:'10px' }} size="small">
+                    <Card key={el.id} title={el.title} extra={<div>{el.isVipOnly ? <span style={{color:'orange',fontWeight:'bold'}}>VIP </span>:''}<span style={{color:'red',cursor:'pointer'}} onClick={()=>deleteMenu(el.id)}>Избриши</span></div>} style={{ width: 300, display:'inline-block', margin:'10px' }} size="small">
+                        <div style={{height:'100px', width:'270px'}}>
+                            <Upload
+                                name="file"
+                                onChange={uploadChanged}
+                                showUploadList={false}
+                                beforeUpload={beforeUpload}
+                                style={{height: '100px', overflow: 'hidden'}}
+                                action={env.api+'Menu/'+el.id+'/upload'}
+                            >
+                                {el.image != "data:image/png;base64," ? <img style={{cursor: 'pointer'}} src={el.image} alt="avatar"
+                                                                                           height='100px' width={'270px'}/> : <div style={{cursor:'pointer',margin: 15,border:'1px solid gray',padding: 5}}><PlusOutlined /><div style={{ marginTop: 8}}>Додади слика</div></div>}
+                            </Upload>
+                        </div>
                         <p>{el.description}</p>
+                        <p>Алергени: {el.alergens.length ==0 ? 'Нема' : el.alergens}</p>
                         <b>{el.price} ден.</b>
                     </Card>
Index: frontend/src/Dashboard/Vip.js
===================================================================
--- frontend/src/Dashboard/Vip.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
+++ frontend/src/Dashboard/Vip.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -0,0 +1,66 @@
+import React, {useEffect, useState} from 'react';
+import {Checkbox, Input, List} from "antd";
+import moment from "moment";
+import axios from "axios";
+import env from "../env";
+
+const Vip = (props) =>{
+
+    const [loading,setLoading] = useState(true);
+    const [users,setUsers] = useState([]);
+
+    const getData = () =>{
+        axios.get(env.api + 'Users', {
+            headers: {Authorization: localStorage.getItem('Auth')}
+        }).then(res => {
+            console.log(res.data)
+            setUsers(res.data.sort(x => x.id));
+            setLoading(false);
+        });
+    }
+
+    useEffect(()=>{
+        getData()
+    },[])
+
+    const updateVip = (id, val) => {
+        console.log(val.target.checked)
+        setLoading(true)
+        axios.post(env.api + 'Users/'+id+'/vip', {},{
+            params: {newStatus: val.target.checked},
+            headers: {Authorization: localStorage.getItem('Auth')}
+        }).then(res => {
+            getData()
+            setLoading(false);
+        });
+    }
+
+
+    return(
+        <div style={{padding:'20px'}}>
+            <div style={{
+                width: '100%',
+                height:'75px',
+                backgroundColor: 'white',
+                padding: '20px',
+                border: '1px solid lightgray'
+            }} >
+                <h2 style={{float: 'left'}}>VIP корисници</h2>
+            </div>
+            <div style={{backgroundColor:'white'}}>
+            <List loading={loading} dataSource={users} itemLayout={'horizontal'} locale={{emptyText:'Нема корисници'}}
+                  renderItem={item => (
+                      <List.Item
+                          actions={[<Checkbox checked={item.isVip} onChange={(val)=>updateVip(item.id,val)}>Вип корисник</Checkbox>]}>
+                          <div style={{display:'flex',flexDirection:'row',justifyContent:'space-between',width:'100%', padding:'10px'}}>
+                              <span>{item.id}</span>
+                              <span>{item.email}</span>
+                          </div>
+                      </List.Item>
+                  )}/>
+            </div>
+        </div>
+    )
+}
+
+export default Vip;
Index: frontend/src/FrontPage.js
===================================================================
--- frontend/src/FrontPage.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/FrontPage.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -2,5 +2,5 @@
 import {Header} from "./Header";
 import {Link, useNavigate} from "react-router-dom";
-import {Button, Card, DatePicker, Form, Image, Input, Modal, notification, Rate, Spin} from "antd";
+import {Button, Card, DatePicker, Form, Image, Input, Modal, notification, Rate, Spin, Upload} from "antd";
 import placeholderImage from '../src/Assets/placeholder.png'
 import AddNewReservation from "./Dashboard/AddNewReservation";
@@ -8,4 +8,5 @@
 import env from "./env";
 import Review from "./Dashboard/Review";
+import {PlusOutlined} from "@ant-design/icons";
 
 const FrontPage = ({user, logout}) => {
@@ -17,4 +18,5 @@
     const [refreshToggle, setRefreshToggle] = useState(false);
     const history = useNavigate();
+    const [filteredMenuItems, setFilteredMenuItems] = useState([]);
 
     useEffect(()=>{
@@ -22,7 +24,13 @@
         axios.get(env.api + 'Restaurants').then(res=>{
             setRestaurant(res.data);
+            console.log(user);
+            if(!user || !user.isVip){
+                setFilteredMenuItems(res.data.menu.filter(x => !x.isVipOnly));
+            }else{
+                setFilteredMenuItems(res.data.menu.sort((x,y) => x.isVipOnly ? -1 : 1));
+            }
             setLoading(false);
         });
-    },[])
+    },[user])
 
     useEffect(()=>{
@@ -33,4 +41,25 @@
         }
     },[user])
+
+    const updateSearchValue = (value) => {
+        const val = value.target.value.toLowerCase();
+        setFilteredMenuItems(items=>{
+            if(val.length==0){
+                return restaurant.menu;
+            }
+            const its = val.split(' ');
+            let allItems = []
+            if(!user || !user.isVip){
+                allItems = [...restaurant.menu.filter(x => !x.isVipOnly)]
+            }else{
+                allItems = [...restaurant.menu.sort(x => x.isVipOnly)]
+            }
+            for(let it of its){
+                if(it.length>0)
+                    allItems = allItems.filter(x => !x.alergens.includes(it));
+            }
+            return allItems;
+        })
+    }
 
     const saveNewReview = data =>{
@@ -53,5 +82,5 @@
     return(
         <div>
-            <Header onClickButton={!user?()=>history('/login'):logout} buttonText={!user?'Најави се':'Одјави се'}/>
+            <Header onClickButton={!user?()=>history('/login'):logout} buttonText={!user?'Најави се':'Одјави се'} isVip={user && user.isVip}/>
             {loading ? <Spin style={{margin: 20}}/> :
                 <div style={{
@@ -105,8 +134,18 @@
                         }} >
                             <h2 style={{float: 'left'}}>Мени</h2>
+                            <Input.Search onChange={updateSearchValue} placeholder={'Филтрирај алергени'} style={{float:'right', width:'200px'}}/>
                         </div>
-                        {restaurant.menu.map(el =>
-                            <Card key={el.id} title={el.title} style={{ width: 280, display:'inline-block', margin:'10px' }} size="small">
+                        {filteredMenuItems.map(el =>
+                            <Card
+                                key={el.id}
+                                title={el.title}
+                                extra={el.isVipOnly ? <span style={{color:'orange',fontWeight:'bold'}}>VIP </span>:''}
+                                style={{ width: 280, display:'inline-block', margin:'10px',verticalAlign:'middle' }}
+                                size="small"
+                                cover={el.image != "data:image/png;base64," ? <img style={{cursor: 'pointer'}} src={el.image} alt="avatar"
+                                                                                    height='100px' width={'270px'}/> : ''}
+                            >
                                 <p>{el.description}</p>
+                                <p>Алергени: {el.alergens.length ==0 ? 'Нема' : el.alergens}</p>
                                 <b>{el.price} ден.</b>
                             </Card>
Index: frontend/src/Header.js
===================================================================
--- frontend/src/Header.js	(revision 49b0bbdee0b42a78614200bd78c91aa43e4a5d1c)
+++ frontend/src/Header.js	(revision 13f14722ed5b1d5b3afb1db9ebefa98117f0e19a)
@@ -10,4 +10,5 @@
             {props.buttonText}
         </Button>
+        {props.isVip ? <span style={{color:'orange', float:'right', fontSize:'28px', fontWeight:'bold', marginRight:'10px'}}>VIP</span>:''}
     </div>;
 }
