Index: back_end/src/main/java/it/finki/tinki/TinkiApplication.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/TinkiApplication.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/TinkiApplication.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,14 @@
+package it.finki.tinki;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class TinkiApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TinkiApplication.class, args);
+    }
+
+}
Index: back_end/src/main/java/it/finki/tinki/bootstrap/DataHolder.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/bootstrap/DataHolder.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/bootstrap/DataHolder.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,114 @@
+package it.finki.tinki.bootstrap;
+
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.repository.*;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.WorkService;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class DataHolder {
+
+    SkillRepository skillRepository;
+    AccountService accountService;
+    WorkService workService;
+    MatchRepository matchRepository;
+
+    public DataHolder(SkillRepository skillRepository,
+                      AccountService accountService,
+                      WorkService workService,
+                      MatchRepository matchRepository) {
+        this.skillRepository = skillRepository;
+        this.accountService = accountService;
+        this.workService = workService;
+        this.matchRepository = matchRepository;
+    }
+
+    @PostConstruct
+    public void init(){
+        if(this.skillRepository.findAll().size()==0){
+            Skill s1 = new Skill("C++");
+            Skill s2 = new Skill("Java");
+            Skill s3 = new Skill("Python");
+            Skill s4 = new Skill("JavaScript");
+            Skill s5 = new Skill("React");
+            Skill s6 = new Skill("Spring");
+            Skill s7 = new Skill("C#");
+            Skill s8 = new Skill(".NET");
+            Skill s9 = new Skill("NodeJs");
+            Skill s0 = new Skill("Go");
+
+            this.skillRepository.save(s1);
+            this.skillRepository.save(s2);
+            this.skillRepository.save(s3);
+            this.skillRepository.save(s4);
+            this.skillRepository.save(s5);
+            this.skillRepository.save(s6);
+            this.skillRepository.save(s7);
+            this.skillRepository.save(s8);
+            this.skillRepository.save(s9);
+            this.skillRepository.save(s0);
+        }
+
+        if(!this.accountService.hasData()){
+            List<Skill> lista;
+            lista = this.skillRepository.findAll();
+
+            List<Skill> lista2 = new ArrayList<>();
+            lista2.add(this.skillRepository.findById(3L).get());
+            lista2.add(this.skillRepository.findById(2L).get());
+            lista2.add(this.skillRepository.findById(4L).get());
+            lista2.add(this.skillRepository.findById(7L).get());
+            lista2.add(this.skillRepository.findById(1L).get());
+            lista2.add(this.skillRepository.findById(5L).get());
+            lista2.add(this.skillRepository.findById(9L).get());
+            lista2.add(this.skillRepository.findById(6L).get());
+
+
+            List<Skill> lista3 = new ArrayList<>();
+            lista3.add(this.skillRepository.findById(3L).get());
+            lista3.add(this.skillRepository.findById(2L).get());
+            lista3.add(this.skillRepository.findById(4L).get());
+            lista3.add(this.skillRepository.findById(7L).get());
+
+            List<Long> allSkills = new ArrayList<>();
+            lista.forEach(item -> {
+                allSkills.add(item.getId());
+            });
+
+            List<Long> skills8 = new ArrayList<>();
+            lista2.forEach(item -> {
+                skills8.add(item.getId());
+            });
+
+            List<Long> skills4 = new ArrayList<>();
+            lista3.forEach(item -> {
+                skills4.add(item.getId());
+            });
+
+            Account c = this.accountService.registerCompany("company@company", "company", "Co.Co", "Macedonia", "Skopje", "Pero Nakov");
+            Account ct = this.accountService.registerCompany("company@co", "company", "Co.Co", "Macedonia", "Skopje", "Pero Nakov");
+            Account m = this.accountService.registerTeam("team@team", "team", "TeamRocket", 3);
+
+            this.workService.insertJob("Team Job 1", "Team job 1 requires 3 members!", m.getId() ,1515, allSkills, AccountType.TEAM);
+            this.workService.insertJob("Team Job 2", "Team job 2 requires 2 members!", m.getId() ,5511, skills4, AccountType.TEAM);
+            this.workService.insertJob("Company Job 1", "Company job 1 requires 3 members!", c.getId() ,12345, allSkills, AccountType.COMPANY);
+            this.workService.insertJob("Company Job 2", "Company job 2 requires 3 members!", ct.getId() ,8901, skills8, AccountType.COMPANY);
+            this.workService.insertInternship("Internship 1", "Opportunity to learn new things!", c.getId() ,5000, skills4, 6, AccountType.COMPANY);
+            this.workService.insertInternship("Internship 2", "Opportunity to learn new things!", c.getId() ,5000, allSkills, 3, AccountType.COMPANY);
+            this.workService.insertProject("Project 1", "Project that lasts few days!", m.getId() ,5000, skills8, new Date(), AccountType.TEAM);
+            this.workService.insertProject("Project 2", "Project that ends soon!", m.getId() ,5000, skills4, new Date(), AccountType.TEAM);
+
+            this.accountService.registerUser("user@user", "user", "Zoki", "Poki", lista3, lista);
+        }
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/helper/Matchmaker.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/helper/Matchmaker.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/helper/Matchmaker.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,29 @@
+package it.finki.tinki.helper;
+
+import it.finki.tinki.model.Skill;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class Matchmaker {
+
+    public static float match(List<Skill> work, List<Skill> user){
+
+        float coef = work.size();
+        float k = 0;
+
+        for (Skill skill : work) {
+            for (Skill value : user) {
+                if (value.equals(skill)) {
+                    k++;
+                }
+            }
+        }
+
+        System.out.println(k/coef);
+
+        return k/coef;
+    }
+
+}
Index: back_end/src/main/java/it/finki/tinki/model/Address.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Address.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Address.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,26 @@
+package it.finki.tinki.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Entity
+@Data
+public class Address {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    Long id;
+
+    String country;
+    String city;
+    String street;
+
+    public Address() {}
+
+    public Address(String country, String city, String street) {
+        this.country = country;
+        this.city = city;
+        this.street = street;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/EmbeddedMatchId.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/EmbeddedMatchId.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/EmbeddedMatchId.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,27 @@
+package it.finki.tinki.model;
+
+import it.finki.tinki.model.Work.Work;
+import it.finki.tinki.model.Users.User;
+import lombok.Data;
+
+import javax.persistence.Embeddable;
+import javax.persistence.OneToOne;
+import java.io.Serializable;
+
+@Embeddable
+@Data
+public class EmbeddedMatchId implements Serializable {
+
+    @OneToOne
+    private Work work;
+
+    @OneToOne
+    private User user;
+
+    public EmbeddedMatchId(){}
+
+    public EmbeddedMatchId(Work work, User user){
+        this.work = work;
+        this.user = user;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Match.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Match.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Match.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,26 @@
+package it.finki.tinki.model;
+
+import it.finki.tinki.model.enumerator.WorkType;
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Entity
+@Data
+public class Match {
+
+    @Id
+    EmbeddedMatchId embeddedMatchId;
+
+    float coefficient;
+
+    WorkType type;
+
+    public Match(){}
+
+    public Match(EmbeddedMatchId embeddedMatchId, float coefficient, WorkType type) {
+        this.embeddedMatchId = embeddedMatchId;
+        this.coefficient = coefficient;
+        this.type = type;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Skill.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Skill.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Skill.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,25 @@
+package it.finki.tinki.model;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+@Data
+public class Skill {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    Long id;
+
+    String name;
+
+    public Skill(){}
+
+    public Skill(String name) {
+        this.name = name;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Users/Account.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Users/Account.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Users/Account.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,38 @@
+package it.finki.tinki.model.Users;
+
+import com.sun.istack.NotNull;
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Entity
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+public abstract class Account {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    Long id;
+
+    @Column(unique = true)
+    @NotNull
+    String email;
+
+    @NotNull
+    String password;
+
+    @NotNull
+    String name;
+
+    AccountType accountType;
+
+    public Account(){}
+
+    public Account(String email, String password, String name, AccountType accountType) {
+        this.email = email;
+        this.password = password;
+        this.name = name;
+        this.accountType = accountType;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Users/Company.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Users/Company.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Users/Company.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,23 @@
+package it.finki.tinki.model.Users;
+
+import it.finki.tinki.model.Address;
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+
+@Entity
+@Data
+public class Company extends Account{
+
+    @OneToOne
+    Address address;
+
+    public Company(){}
+
+    public Company(String email, String password, String name, AccountType accountType, Address address) {
+        super(email, password, name, accountType);
+        this.address = address;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Users/Team.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Users/Team.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Users/Team.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,20 @@
+package it.finki.tinki.model.Users;
+
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+import javax.persistence.Entity;
+
+@Entity
+@Data
+public class Team extends Account {
+
+    int members;
+
+    public Team(){}
+
+    public Team(String email, String password, String name, AccountType accountType, int members) {
+        super(email, password, name, accountType);
+        this.members = members;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Users/User.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Users/User.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Users/User.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,35 @@
+package it.finki.tinki.model.Users;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import java.util.List;
+
+@Entity(name = "users")
+@Data
+public class User extends Account{
+
+    String surname;
+
+    @ManyToMany
+    List<Skill> retainedSkills;
+
+    @ManyToMany
+    List<Skill> skillsToLearn;
+
+    public User(){}
+
+    public User(String email, String password, String name, AccountType accountType, String surname, List<Skill> retainedSkills, List<Skill> skillsToLearn) {
+        super(email, password, name, accountType);
+        this.surname = surname;
+        this.retainedSkills = retainedSkills;
+        this.skillsToLearn = skillsToLearn;
+    }
+
+    public String toString(){
+        return "";
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Work/Internship.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Work/Internship.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Work/Internship.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,26 @@
+package it.finki.tinki.model.Work;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Data
+public class Internship extends Work {
+
+    @ManyToMany(fetch = FetchType.EAGER)
+    List<Skill> skillsTrained;
+
+    int openSpots;
+
+    public Internship(){}
+
+    public Internship(String title, String description, Account account, int salary, List<Skill> skillsTrained, int openSpots) {
+        super(title, description, account, salary);
+        this.skillsTrained = skillsTrained;
+        this.openSpots = openSpots;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Work/Job.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Work/Job.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Work/Job.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,23 @@
+package it.finki.tinki.model.Work;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Data
+public class Job extends Work {
+
+    @ManyToMany(fetch = FetchType.EAGER)
+    List<Skill> skillsRequired;
+
+    public Job(){}
+
+    public Job(String title, String description, Account account, int salary, List<Skill> skillsRequired) {
+        super(title, description, account, salary);
+        this.skillsRequired = skillsRequired;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Work/Project.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Work/Project.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Work/Project.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,27 @@
+package it.finki.tinki.model.Work;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Data
+public class Project extends Work {
+
+    @ManyToMany(fetch = FetchType.EAGER)
+    List<Skill> skillsRequired;
+
+    Date validUntil;
+
+    public Project(){}
+
+    public Project(String title, String description, Account account, int salary, List<Skill> skillsRequired, Date validUntil) {
+        super(title, description, account, salary);
+        this.skillsRequired = skillsRequired;
+        this.validUntil = validUntil;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/Work/Work.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/Work/Work.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/Work/Work.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,33 @@
+package it.finki.tinki.model.Work;
+
+import it.finki.tinki.model.Users.Account;
+import lombok.Data;
+
+import javax.persistence.*;
+
+@Entity
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+public abstract class Work {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    Long id;
+
+    String title;
+    String description;
+
+    @ManyToOne(targetEntity = Account.class)
+    Account account;
+
+    int salary;
+
+    public Work(){}
+
+    public Work(String title, String description, Account account, int salary) {
+        this.title = title;
+        this.description = description;
+        this.account = account;
+        this.salary = salary;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/AccountLoginDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/AccountLoginDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/AccountLoginDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,11 @@
+package it.finki.tinki.model.dto;
+
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+@Data
+public class AccountLoginDTO {
+    private String email;
+    private String password;
+    private AccountType type;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/edit/work/InternshipEditDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/edit/work/InternshipEditDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/edit/work/InternshipEditDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,8 @@
+package it.finki.tinki.model.dto.edit.work;
+
+import lombok.Data;
+
+@Data
+public class InternshipEditDTO extends WorkEditDTO{
+    int openSpots;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/edit/work/WorkEditDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/edit/work/WorkEditDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/edit/work/WorkEditDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,11 @@
+package it.finki.tinki.model.dto.edit.work;
+
+import lombok.Data;
+
+@Data
+public class WorkEditDTO {
+    String title;
+    String description;
+    Long accountId;
+    int salary;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/account/AccountRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/account/AccountRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/account/AccountRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,10 @@
+package it.finki.tinki.model.dto.register.account;
+
+import lombok.Data;
+
+@Data
+public class AccountRegisterDTO {
+    String email;
+    String password;
+    String name;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/account/CompanyRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/account/CompanyRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/account/CompanyRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,10 @@
+package it.finki.tinki.model.dto.register.account;
+
+import lombok.Data;
+
+@Data
+public class CompanyRegisterDTO extends AccountRegisterDTO {
+    String country;
+    String city;
+    String street;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/account/TeamRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/account/TeamRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/account/TeamRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,8 @@
+package it.finki.tinki.model.dto.register.account;
+
+import lombok.Data;
+
+@Data
+public class TeamRegisterDTO extends AccountRegisterDTO {
+    int members;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/account/UserRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/account/UserRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/account/UserRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,12 @@
+package it.finki.tinki.model.dto.register.account;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserRegisterDTO extends AccountRegisterDTO {
+    String surname;
+    List<Long> retainedSkills;
+    List<Long> skillsToLearn;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/work/InternshipRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/work/InternshipRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/work/InternshipRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,11 @@
+package it.finki.tinki.model.dto.register.work;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InternshipRegisterDTO extends WorkRegisterDTO {
+    int openSpots;
+    List<Long> skillsTrained;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/work/JobRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/work/JobRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/work/JobRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,10 @@
+package it.finki.tinki.model.dto.register.work;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class JobRegisterDTO extends WorkRegisterDTO{
+    List<Long> skillsRequired;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/work/ProjectRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/work/ProjectRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/work/ProjectRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,12 @@
+package it.finki.tinki.model.dto.register.work;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class ProjectRegisterDTO extends WorkRegisterDTO {
+    Date validUntil;
+    List<Long> skillsRequired;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/register/work/WorkRegisterDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/register/work/WorkRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/register/work/WorkRegisterDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,13 @@
+package it.finki.tinki.model.dto.register.work;
+
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+@Data
+public class WorkRegisterDTO {
+    String title;
+    String description;
+    Long accountId;
+    int salary;
+    AccountType type;
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/account/CompanyResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/account/CompanyResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/account/CompanyResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,22 @@
+package it.finki.tinki.model.dto.response.account;
+
+import it.finki.tinki.model.Address;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class CompanyResponseDTO extends LoginResponseDTO {
+    private Address address;
+    private List<JobResponseDTO> jobs;
+    private List<InternshipResponseDTO> internships;
+
+    public CompanyResponseDTO(){
+        super();
+        this.jobs = new ArrayList<>();
+        this.internships = new ArrayList<>();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/account/LoginResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/account/LoginResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/account/LoginResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,17 @@
+package it.finki.tinki.model.dto.response.account;
+
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+@Data
+public class LoginResponseDTO {
+    private Long id;
+    private String email;
+    private String name;
+    private AccountType type;
+    private String error;
+
+    public LoginResponseDTO() {
+        this.error = "Invalid username or password!";
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/account/TeamResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/account/TeamResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/account/TeamResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,21 @@
+package it.finki.tinki.model.dto.response.account;
+
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class TeamResponseDTO extends LoginResponseDTO {
+    private int members;
+    private List<JobResponseDTO> jobs;
+    private List<ProjectResponseDTO> projects;
+
+    public TeamResponseDTO(){
+        super();
+        this.jobs = new ArrayList<>();
+        this.projects = new ArrayList<>();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/account/UserResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/account/UserResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/account/UserResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,28 @@
+package it.finki.tinki.model.dto.response.account;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class UserResponseDTO extends LoginResponseDTO {
+    private String surname;
+    private List<Skill> retained;
+    private List<Skill> toLearn;
+    private List<JobResponseDTO> jobs;
+    private List<InternshipResponseDTO> internships;
+    private List<ProjectResponseDTO> projects;
+
+    public UserResponseDTO(){
+        retained = new ArrayList<>();
+        toLearn = new ArrayList<>();
+        jobs = new ArrayList<>();
+        internships = new ArrayList<>();
+        projects = new ArrayList<>();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/work/InternshipResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/work/InternshipResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/work/InternshipResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,29 @@
+package it.finki.tinki.model.dto.response.work;
+
+import it.finki.tinki.model.Address;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Users.Company;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InternshipResponseDTO extends WorkResponseDTO {
+    int salary;
+    int openSpots;
+    Address accountAddress;
+    List<Skill> skillsTrained;
+
+    public InternshipResponseDTO(){
+        super("Internship!");
+    }
+
+    public InternshipResponseDTO(Internship internship){
+        super(internship.getId(), internship.getTitle(), internship.getDescription(), internship.getSalary(), internship.getAccount());
+        this.salary = internship.getSalary();
+        this.openSpots = internship.getOpenSpots();
+        this.accountAddress = ((Company) internship.getAccount()).getAddress();
+        this.skillsTrained = internship.getSkillsTrained();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/work/JobResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/work/JobResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/work/JobResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,34 @@
+package it.finki.tinki.model.dto.response.work;
+
+import it.finki.tinki.model.Address;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class JobResponseDTO extends WorkResponseDTO {
+    Address accountAddress;
+    int members;
+    List<Skill> skillsRequired;
+
+    public JobResponseDTO(){
+        super("Job!");
+    }
+
+    public JobResponseDTO(Job job){
+        super(job.getId(), job.getTitle(), job.getDescription(), job.getSalary(), job.getAccount());
+        this.skillsRequired = job.getSkillsRequired();
+        if(job.getAccount().getAccountType()==AccountType.COMPANY){
+            this.accountAddress = ((Company) job.getAccount()).getAddress();
+            this.members = 0;
+        }else{
+            this.members = ((Team) job.getAccount()).getMembers();
+            this.accountAddress = null;
+        }
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/work/ProjectResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/work/ProjectResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/work/ProjectResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,27 @@
+package it.finki.tinki.model.dto.response.work;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.Users.Team;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class ProjectResponseDTO extends WorkResponseDTO {
+    int members;
+    Date validUntil;
+    List<Skill> skillsRequired;
+
+    public ProjectResponseDTO(){
+        super("Project!");
+    }
+
+    public ProjectResponseDTO(Project project){
+        super(project.getId(), project.getTitle(), project.getDescription(), project.getSalary(), project.getAccount());
+        this.members = ((Team) project.getAccount()).getMembers();
+        this.validUntil = project.getValidUntil();
+        this.skillsRequired = project.getSkillsRequired();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/dto/response/work/WorkResponseDTO.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/dto/response/work/WorkResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/dto/response/work/WorkResponseDTO.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,36 @@
+package it.finki.tinki.model.dto.response.work;
+
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.enumerator.AccountType;
+import lombok.Data;
+
+@Data
+public class WorkResponseDTO {
+    Long id;
+    String title;
+    String description;
+    int salary;
+    String accountEmail;
+    String accountName;
+    Long accountId;
+    AccountType accountType;
+    String error;
+
+    WorkResponseDTO(){}
+
+    WorkResponseDTO(String item){
+        this.error = "Error registering " + item;
+    }
+
+    WorkResponseDTO(Long id, String title, String description, int salary, Account account){
+        this.error = null;
+        this.id = id;
+        this.title = title;
+        this.description = description;
+        this.salary = salary;
+        this.accountId = account.getId();
+        this.accountEmail = account.getEmail();
+        this.accountName = account.getName();
+        this.accountType = account.getAccountType();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/enumerator/AccountType.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/enumerator/AccountType.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/enumerator/AccountType.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,7 @@
+package it.finki.tinki.model.enumerator;
+
+public enum AccountType {
+    USER,
+    TEAM,
+    COMPANY
+}
Index: back_end/src/main/java/it/finki/tinki/model/enumerator/WorkType.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/enumerator/WorkType.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/enumerator/WorkType.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,7 @@
+package it.finki.tinki.model.enumerator;
+
+public enum WorkType {
+    JOB,
+    INTERNSHIP,
+    PROJECT
+}
Index: back_end/src/main/java/it/finki/tinki/model/exception/InvalidArgumentsException.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/exception/InvalidArgumentsException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/exception/InvalidArgumentsException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,7 @@
+package it.finki.tinki.model.exception;
+
+public class InvalidArgumentsException extends RuntimeException{
+    public InvalidArgumentsException(){
+        super("Invalid arguments entered!");
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/exception/SkillNotFoundException.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/exception/SkillNotFoundException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/exception/SkillNotFoundException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,7 @@
+package it.finki.tinki.model.exception;
+
+public class SkillNotFoundException extends RuntimeException{
+    public SkillNotFoundException(Long id){
+        super(String.format("Skill with id: %d was not found!", id));
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/model/exception/UserExistsException.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/model/exception/UserExistsException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/model/exception/UserExistsException.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,8 @@
+package it.finki.tinki.model.exception;
+
+
+public class UserExistsException extends RuntimeException{
+    public UserExistsException(){
+        super("User with that email already exists!");
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/repository/AddressRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/AddressRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/AddressRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,9 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Address;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AddressRepository extends JpaRepository<Address, Long> {
+}
Index: back_end/src/main/java/it/finki/tinki/repository/CompanyRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/CompanyRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/CompanyRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,14 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Users.Company;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface CompanyRepository extends JpaRepository<Company, Long> {
+    Company findByEmailAndPassword(String email, String password);
+    Optional<Company> findByEmail(String email);
+    Optional<Company> findByIdAndEmail(Long id, String email);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/InternshipRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/InternshipRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/InternshipRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,16 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface InternshipRepository extends JpaRepository<Internship, Long> {
+    List<Internship> findAllByAccount_Id(Long accountId);
+    List<Internship> findAllByTitleContainsOrDescriptionContains(String title, String description);
+    List<Internship> findAllBySkillsTrainedContaining(Skill skill);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/JobRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/JobRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/JobRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,16 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Job;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+@Repository
+public interface JobRepository extends JpaRepository<Job, Long>{
+    List<Job> findAllByAccount_Id(Long accountId);
+    List<Job> findAllByTitleContainsOrDescriptionContains(String title, String description);
+    List<Job> findAllBySkillsRequiredContaining(Skill skill);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/MatchRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/MatchRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/MatchRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,16 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.EmbeddedMatchId;
+import it.finki.tinki.model.Match;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.enumerator.WorkType;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface MatchRepository extends JpaRepository<Match, EmbeddedMatchId> {
+    List<Match> findAllByEmbeddedMatchIdUserAndTypeOrderByCoefficientDesc(User user, WorkType type);
+    List<Match> deleteAllByEmbeddedMatchId_User_Id(Long userId);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/ProjectRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/ProjectRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/ProjectRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,16 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ProjectRepository extends JpaRepository<Project, Long> {
+    List<Project> findAllByAccount_Id(Long accountId);
+    List<Project> findAllByTitleContainsOrDescriptionContains(String title, String description);
+    List<Project> findAllBySkillsRequiredContaining(Skill skill);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/SkillRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/SkillRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/SkillRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,14 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Skill;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SkillRepository extends JpaRepository<Skill, Long> {
+    Optional<Skill> findById(Long id);
+    List<Skill> findAllByNameContaining(String text);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/TeamRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/TeamRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/TeamRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,15 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface TeamRepository extends JpaRepository<Team, Long> {
+    Team findByEmailAndPassword(String email, String password);
+    Optional<Team> findByEmail(String email);
+    Optional<Team> findByIdAndEmail(Long id, String email);
+}
Index: back_end/src/main/java/it/finki/tinki/repository/UserRepository.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/repository/UserRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/repository/UserRepository.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,14 @@
+package it.finki.tinki.repository;
+
+import it.finki.tinki.model.Users.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface UserRepository extends JpaRepository<User, Long> {
+    User findByEmailAndPassword(String email, String password);
+    Optional<User> findByEmail(String email);
+    Optional<User> findByIdAndEmail(Long id, String email);
+}
Index: back_end/src/main/java/it/finki/tinki/service/AccountService.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/AccountService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/AccountService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,24 @@
+package it.finki.tinki.service;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.enumerator.AccountType;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface AccountService {
+    boolean hasData();
+    Account findUser(String email, String password, AccountType type);
+    Account registerUser(String email, String password, String name, String surname, List<Skill> retainedSkills, List<Skill> skillsToLearn);
+    Account registerTeam(String email, String password, String name, int members);
+    Account registerCompany(String email, String password, String name, String country, String city, String street);
+    Account findByIdAndType(Long accId, AccountType type);
+    User editUser(Long id, String email, String name, String surname, List<Skill> retainedSkills, List<Skill> skillsToLearn);
+    Company editCompany(Long id, String email, String name, String country, String city, String street);
+    Team editTeam(Long id, String email, String name, int members);
+    Optional<?> findByIdAndEmail(Long id, String email, AccountType type);
+}
Index: back_end/src/main/java/it/finki/tinki/service/BuilderService.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/BuilderService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/BuilderService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,12 @@
+package it.finki.tinki.service;
+
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.dto.response.account.CompanyResponseDTO;
+import it.finki.tinki.model.dto.response.account.TeamResponseDTO;
+import it.finki.tinki.model.dto.response.account.UserResponseDTO;
+
+public interface BuilderService {
+    UserResponseDTO buildUserResponseDTO(Account a1);
+    CompanyResponseDTO buildCompanyResponseDTO(Account a1);
+    TeamResponseDTO buildTeamResponseDTO(Account a1);
+}
Index: back_end/src/main/java/it/finki/tinki/service/MatchmakerService.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/MatchmakerService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/MatchmakerService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,19 @@
+package it.finki.tinki.service;
+
+import it.finki.tinki.model.Match;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.Users.User;
+
+import java.util.List;
+
+public interface MatchmakerService {
+    List<Internship> getMatchingInternshipsForUser(User user);
+    List<Job> getMatchingJobsForUser(User user);
+    List<Project> getMatchingProjectsForUser(User user);
+    void setUpUserJobMatches(Job job, User user);
+    void setUpUserProjectMatches(Project project, User user);
+    void setUpUserInternshipMatches(Internship internship, User user);
+    List<Match> removeByUserId(Long userId);
+}
Index: back_end/src/main/java/it/finki/tinki/service/SkillService.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/SkillService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/SkillService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,11 @@
+package it.finki.tinki.service;
+
+import it.finki.tinki.model.Skill;
+
+import java.util.List;
+
+public interface SkillService {
+    List<Skill> returnSkillsBasedOnId(List<Long> skillIds);
+    List<Skill> returnBasedOnText(String text);
+    List<Skill> findAll();
+}
Index: back_end/src/main/java/it/finki/tinki/service/WorkService.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/WorkService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/WorkService.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,30 @@
+package it.finki.tinki.service;
+
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.model.enumerator.AccountType;
+
+import java.util.Date;
+import java.util.List;
+
+public interface WorkService {
+    List<Job> getAllJobsByAccount(Long accId);
+    List<Internship> getAllInternshipsByAccount(Long accId);
+    List<Project> getAllProjectsByAccount(Long accId);
+    Job insertJob(String title, String description, Long accId, int salary, List<Long> skillsRequired, AccountType type);
+    Internship insertInternship(String title, String description, Long adccId, int salary, List<Long> skillsTrained, int openSpots, AccountType type);
+    Project insertProject(String title, String description, Long adccId, int salary, List<Long> skillsRequired, Date validUntil, AccountType type);
+    Job editJob(Long id, String title, String description, int salary);
+    Internship editInternship(Long id, String title, String description, int salary, int openSpots);
+    Project editProject(Long id, String title, String description, int salary);
+    List<JobResponseDTO> fullTextJobSearch(String text);
+    List<InternshipResponseDTO> fullTextInternshipSearch(String text);
+    List<ProjectResponseDTO> fullTextProjectSearch(String text);
+    Job getJobById(Long id);
+    Internship getInternshipById(Long id);
+    Project getProjectById(Long id);
+}
Index: back_end/src/main/java/it/finki/tinki/service/impl/AccountServiceImpl.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/impl/AccountServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/impl/AccountServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,255 @@
+package it.finki.tinki.service.impl;
+
+import it.finki.tinki.model.Address;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.model.exception.InvalidArgumentsException;
+import it.finki.tinki.model.exception.UserExistsException;
+import it.finki.tinki.repository.*;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.MatchmakerService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class AccountServiceImpl implements AccountService {
+
+    AddressRepository addressRepository;
+    UserRepository userRepository;
+    TeamRepository teamRepository;
+    CompanyRepository companyRepository;
+    JobRepository jobRepository;
+    ProjectRepository projectRepository;
+    InternshipRepository internshipRepository;
+    MatchmakerService matchmakerService;
+
+    public AccountServiceImpl(AddressRepository addressRepository,
+                              UserRepository userRepository,
+                              TeamRepository teamRepository,
+                              CompanyRepository companyRepository,
+                              MatchmakerService matchmakerService,
+                              JobRepository jobRepository,
+                              ProjectRepository projectRepository,
+                              InternshipRepository internshipRepository) {
+        this.addressRepository = addressRepository;
+        this.userRepository = userRepository;
+        this.teamRepository = teamRepository;
+        this.companyRepository = companyRepository;
+        this.jobRepository = jobRepository;
+        this.projectRepository = projectRepository;
+        this.internshipRepository = internshipRepository;
+        this.matchmakerService = matchmakerService;
+    }
+
+
+    @Override
+    public boolean hasData() {
+
+        List<User> users = this.userRepository.findAll();
+        List<Company> companies = this.companyRepository.findAll();
+        List<Team> teams = this.teamRepository.findAll();
+
+        return users.size() > 0 || companies.size() > 0 || teams.size() > 0;
+    }
+
+    @Override
+    public Account findUser(String email, String password, AccountType type) {
+
+        if(type.equals(AccountType.USER)){
+            User u1 = this.userRepository.findByEmailAndPassword(email, password);
+            return u1;
+        }
+        else if(type.equals(AccountType.TEAM)){
+            Team t1 = this.teamRepository.findByEmailAndPassword(email, password);
+            return t1;
+        }
+        else if(type.equals(AccountType.COMPANY)){
+            Company c1 = this.companyRepository.findByEmailAndPassword(email, password);
+            return c1;
+        }
+
+        return null;
+    }
+
+    public Account registerUser(String email, String password, String name, String surname, List<Skill> retainedSkills, List<Skill> skillsToLearn){
+        if(email==null || email.isEmpty() || password==null || password.isEmpty() || name==null || name.isEmpty() || surname==null || surname.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        if(this.userRepository.findByEmail(email).isPresent()){
+            throw new UserExistsException();
+        }
+
+        User u = new User(email, password, name, AccountType.USER, surname, retainedSkills, skillsToLearn);
+        User ru = this.userRepository.save(u);
+
+        setUpUser(ru);
+
+        return ru;
+    }
+
+    public Account registerTeam(String email, String password, String name, int members){
+        if(email==null || email.isEmpty() || password==null || password.isEmpty() || name==null || name.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        if(this.teamRepository.findByEmail(email).isPresent()){
+            throw new UserExistsException();
+        }
+
+        Team t = new Team(email, password, name, AccountType.TEAM, members);
+        return this.teamRepository.save(t);
+    }
+
+    public Account registerCompany(String email, String password, String name, String country, String city, String street){
+        if(email==null || email.isEmpty() || password==null || password.isEmpty() || name==null || name.isEmpty()
+                || country==null || country.isEmpty() || city==null || city.isEmpty() || street==null || street.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        System.out.println(email);
+
+        if(this.companyRepository.findByEmail(email).isPresent()){
+            throw new UserExistsException();
+        }
+
+        Address a = new Address(country, city, street);
+        this.addressRepository.save(a);
+        Company c = new Company(email, password, name, AccountType.COMPANY, a);
+        return this.companyRepository.save(c);
+    }
+
+    public Account findByIdAndType(Long id, AccountType type){
+        switch (type){
+            case COMPANY:
+                return this.companyRepository.findById(id).get();
+            case TEAM:
+                return this.teamRepository.findById(id).get();
+            case USER:
+                return this.userRepository.findById(id).get();
+        }
+
+        return null;
+    }
+
+    public Optional<?> findByIdAndEmail(Long id, String email, AccountType accountType){
+
+        switch (accountType){
+            case USER:
+                return this.userRepository.findByIdAndEmail(id, email);
+            case TEAM:
+                return this.teamRepository.findByIdAndEmail(id, email);
+            case COMPANY:
+                return this.companyRepository.findByIdAndEmail(id, email);
+        }
+
+        return Optional.empty();
+    }
+
+    public User editUser(Long id, String email, String name, String surname, List<Skill> retainedSkills, List<Skill> skillsToLearn){
+        if(email==null || email.isEmpty() || name==null || name.isEmpty() || surname==null || surname.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        User u = this.userRepository.findById(id).get();
+        Optional<User> t = this.userRepository.findByEmail(email);
+
+        if(t.isPresent() && !t.get().equals(u)){
+            throw new UserExistsException();
+        }
+
+        u.setEmail(email);
+        u.setName(name);
+        u.setSurname(surname);
+        u.setRetainedSkills(retainedSkills);
+        u.setSkillsToLearn(skillsToLearn);
+
+        User m = this.userRepository.save(u);
+
+        setUpUser(m);
+
+        return m;
+    }
+
+    public Company editCompany(Long id, String email, String name, String country, String city, String street){
+        if(email==null || email.isEmpty() || name==null || name.isEmpty()
+                || country==null || country.isEmpty() || city==null || city.isEmpty() || street==null || street.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        Company c = this.companyRepository.findById(id).get();
+        Optional<Company> t = this.companyRepository.findByEmail(email);
+
+        if(t.isPresent() && !t.get().equals(c)){
+            throw new UserExistsException();
+        }
+
+        c.setEmail(email);
+        c.setName(name);
+
+        Address ad = c.getAddress();
+        ad.setCountry(country);
+        ad.setCity(city);
+        ad.setStreet(street);
+
+        this.addressRepository.save(ad);
+        return this.companyRepository.save(c);
+    }
+
+    public Team editTeam(Long id, String email, String name, int members){
+        if(email==null || email.isEmpty() || name==null || name.isEmpty()){
+            throw new InvalidArgumentsException();
+        }
+
+        Team t = this.teamRepository.findById(id).get();
+        Optional<Team> tt = this.teamRepository.findByEmail(email);
+
+        if(tt.isPresent() && !tt.get().equals(t)){
+            throw new UserExistsException();
+        }
+
+        t.setEmail(email);
+        t.setName(name);
+        t.setMembers(members);
+
+        return this.teamRepository.save(t);
+    }
+
+
+    private void setUpUser(User u){
+
+        this.matchmakerService.removeByUserId(u.getId());
+
+        List<Job> jobs = this.jobRepository.findAll();
+        List<Project> projects = this.projectRepository.findAll();
+        List<Internship> internships = this.internshipRepository.findAll();
+
+        if(jobs.size()!=0){
+            for (Job job : jobs) {
+                this.matchmakerService.setUpUserJobMatches(job, u);
+            }
+        }
+
+        if(projects.size()!=0){
+            for (Project project : projects) {
+                this.matchmakerService.setUpUserProjectMatches(project, u);
+            }
+        }
+
+        if(internships.size()!=0){
+            for(Internship internship : internships){
+                this.matchmakerService.setUpUserInternshipMatches(internship, u);
+            }
+        }
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/service/impl/BuilderServiceImpl.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/impl/BuilderServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/impl/BuilderServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,127 @@
+package it.finki.tinki.service.impl;
+
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.dto.response.account.CompanyResponseDTO;
+import it.finki.tinki.model.dto.response.account.TeamResponseDTO;
+import it.finki.tinki.model.dto.response.account.UserResponseDTO;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.service.BuilderService;
+import it.finki.tinki.service.MatchmakerService;
+import it.finki.tinki.service.WorkService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BuilderServiceImpl implements BuilderService {
+
+    MatchmakerService matchmakerService;
+    WorkService workService;
+
+    public BuilderServiceImpl(MatchmakerService matchmakerService, WorkService workService) {
+        this.matchmakerService = matchmakerService;
+        this.workService = workService;
+    }
+
+    @Override
+    public UserResponseDTO buildUserResponseDTO(Account a1) {
+        UserResponseDTO uDto = new UserResponseDTO();
+
+        uDto.setError(null);
+
+        uDto.setId(a1.getId());
+        uDto.setEmail(a1.getEmail());
+        uDto.setName(a1.getName());
+        uDto.setType(AccountType.USER);
+        uDto.setSurname(((User) a1).getSurname());
+
+        uDto.setRetained(((User) a1).getRetainedSkills());
+        uDto.setToLearn(((User) a1).getSkillsToLearn());
+
+        List<Job> matchedJobs = this.matchmakerService.getMatchingJobsForUser((User) a1);
+        List<Project> matchedProjects = this.matchmakerService.getMatchingProjectsForUser((User) a1);
+        List<Internship> matchedInternships = this.matchmakerService.getMatchingInternshipsForUser((User) a1);
+
+        matchedJobs.forEach(job -> {
+            JobResponseDTO dto = new JobResponseDTO(job);
+            uDto.getJobs().add(dto);
+        });
+
+        matchedProjects.forEach(project -> {
+            ProjectResponseDTO dto = new ProjectResponseDTO(project);
+            uDto.getProjects().add(dto);
+        });
+
+        matchedInternships.forEach(internship -> {
+            InternshipResponseDTO dto = new InternshipResponseDTO(internship);
+            uDto.getInternships().add(dto);
+        });
+
+        return uDto;
+    }
+
+    @Override
+    public CompanyResponseDTO buildCompanyResponseDTO(Account a1) {
+        CompanyResponseDTO cDto = new CompanyResponseDTO();
+
+        cDto.setError(null);
+
+        cDto.setId(a1.getId());
+        cDto.setEmail(a1.getEmail());
+        cDto.setName(a1.getName());
+        cDto.setType(AccountType.COMPANY);
+        cDto.setAddress(((Company) a1).getAddress());
+
+        List<Job> jobs = this.workService.getAllJobsByAccount(a1.getId());
+        List<Internship> internships = this.workService.getAllInternshipsByAccount(a1.getId());
+
+        jobs.forEach(job -> {
+            JobResponseDTO dto = new JobResponseDTO(job);
+            cDto.getJobs().add(dto);
+        });
+
+        internships.forEach(internship -> {
+            InternshipResponseDTO dto = new InternshipResponseDTO(internship);
+            cDto.getInternships().add(dto);
+        });
+
+        return cDto;
+    }
+
+    @Override
+    public TeamResponseDTO buildTeamResponseDTO(Account a1) {
+        TeamResponseDTO tDto = new TeamResponseDTO();
+
+        tDto.setError(null);
+
+        tDto.setId(a1.getId());
+        tDto.setEmail(a1.getEmail());
+        tDto.setName(a1.getName());
+        tDto.setType(AccountType.TEAM);
+        tDto.setMembers(((Team) a1).getMembers());
+
+        List<Job> jobs = this.workService.getAllJobsByAccount(a1.getId());
+        List<Project> projects = this.workService.getAllProjectsByAccount(a1.getId());
+
+        jobs.forEach(job -> {
+            JobResponseDTO dto = new JobResponseDTO(job);
+            tDto.getJobs().add(dto);
+        });
+
+        projects.forEach(project -> {
+            ProjectResponseDTO dto = new ProjectResponseDTO(project);
+            tDto.getProjects().add(dto);
+        });
+
+        return tDto;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/service/impl/MatchmakerServiceImpl.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/impl/MatchmakerServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/impl/MatchmakerServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,132 @@
+package it.finki.tinki.service.impl;
+
+import it.finki.tinki.helper.Matchmaker;
+import it.finki.tinki.model.EmbeddedMatchId;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.Match;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.enumerator.WorkType;
+import it.finki.tinki.repository.InternshipRepository;
+import it.finki.tinki.repository.JobRepository;
+import it.finki.tinki.repository.MatchRepository;
+import it.finki.tinki.repository.ProjectRepository;
+import it.finki.tinki.service.MatchmakerService;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class MatchmakerServiceImpl implements MatchmakerService {
+
+    MatchRepository matchRepository;
+    JobRepository jobRepository;
+    InternshipRepository internshipRepository;
+    ProjectRepository projectRepository;
+
+    public MatchmakerServiceImpl(MatchRepository matchRepository,
+                                 JobRepository jobRepository,
+                                 InternshipRepository internshipRepository,
+                                 ProjectRepository projectRepository) {
+        this.matchRepository = matchRepository;
+        this.jobRepository = jobRepository;
+        this.internshipRepository = internshipRepository;
+        this.projectRepository = projectRepository;
+    }
+
+    @Override
+    public List<Internship> getMatchingInternshipsForUser(User user) {
+        List<Match> matches = this.matchRepository.findAllByEmbeddedMatchIdUserAndTypeOrderByCoefficientDesc(user, WorkType.INTERNSHIP);
+
+        List<Internship> internships = new ArrayList<>();
+        if(matches.size()!=0){
+            matches.forEach(match -> {
+                internships.add((Internship) match.getEmbeddedMatchId().getWork());
+            });
+        }
+
+        return internships;
+    }
+
+    @Override
+    public List<Job> getMatchingJobsForUser(User user) {
+        List<Match> matches = this.matchRepository.findAllByEmbeddedMatchIdUserAndTypeOrderByCoefficientDesc(user, WorkType.JOB);
+
+        List<Job> jobs = new ArrayList<>();
+        if(matches.size()!=0) {
+            matches.forEach(match -> {
+                jobs.add((Job) match.getEmbeddedMatchId().getWork());
+            });
+        }
+
+        return jobs;
+    }
+
+    @Override
+    public List<Project> getMatchingProjectsForUser(User user) {
+        List<Match> matches = this.matchRepository.findAllByEmbeddedMatchIdUserAndTypeOrderByCoefficientDesc(user, WorkType.PROJECT);
+
+        List<Project> projects = new ArrayList<>();
+        if(matches.size()!=0) {
+            matches.forEach(match -> {
+                projects.add((Project) match.getEmbeddedMatchId().getWork());
+            });
+        }
+
+        return projects;
+    }
+
+    @Override
+    public void setUpUserJobMatches(Job job, User user) {
+        List<Skill> jobSkill = job.getSkillsRequired();
+        List<Skill> userSkill = user.getRetainedSkills();
+
+        float coef = Matchmaker.match(jobSkill, userSkill);
+
+        if(coef!=0){
+            EmbeddedMatchId embeddedMatchId = new EmbeddedMatchId(job, user);
+            Match m = new Match(embeddedMatchId, coef, WorkType.JOB);
+            this.matchRepository.save(m);
+        }
+    }
+
+    @Override
+    public void setUpUserProjectMatches(Project project, User user) {
+        List<Skill> projectSkills = project.getSkillsRequired();
+        List<Skill> userSkill = user.getRetainedSkills();
+
+        float coef = Matchmaker.match(projectSkills, userSkill);
+
+        if(coef!=0){
+            EmbeddedMatchId embeddedMatchId = new EmbeddedMatchId(project, user);
+            Match m = new Match(embeddedMatchId, coef, WorkType.PROJECT);
+            this.matchRepository.save(m);
+        }
+    }
+
+    @Override
+    public void setUpUserInternshipMatches(Internship internship, User user) {
+        List<Skill> internshipSkills = internship.getSkillsTrained();
+        List<Skill> userSkill = user.getSkillsToLearn();
+
+        float coef = Matchmaker.match(internshipSkills, userSkill);
+
+        if(coef!=0){
+            EmbeddedMatchId embeddedMatchId = new EmbeddedMatchId(internship, user);
+            Match m = new Match(embeddedMatchId, coef, WorkType.INTERNSHIP);
+            this.matchRepository.save(m);
+        }
+    }
+
+    @Transactional
+    @Override
+    public List<Match> removeByUserId(Long userId) {
+        return this.matchRepository.deleteAllByEmbeddedMatchId_User_Id(userId);
+    }
+
+}
Index: back_end/src/main/java/it/finki/tinki/service/impl/SkillServiceImpl.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/impl/SkillServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/impl/SkillServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,40 @@
+package it.finki.tinki.service.impl;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.repository.SkillRepository;
+import it.finki.tinki.service.SkillService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SkillServiceImpl implements SkillService {
+
+    SkillRepository skillRepository;
+
+    public SkillServiceImpl(SkillRepository skillRepository) {
+        this.skillRepository = skillRepository;
+    }
+
+    @Override
+    public List<Skill> returnSkillsBasedOnId(List<Long> skillIds) {
+
+        List<Skill> list = new ArrayList<>();
+
+        skillIds.forEach(skill -> {
+            this.skillRepository.findById(skill).ifPresent(list::add);
+        });
+
+        return list;
+    }
+
+    public List<Skill> returnBasedOnText(String text){
+        return this.skillRepository.findAllByNameContaining(text);
+    }
+
+    @Override
+    public List<Skill> findAll() {
+        return this.skillRepository.findAll();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/service/impl/WorkServiceImpl.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/service/impl/WorkServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/service/impl/WorkServiceImpl.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,241 @@
+package it.finki.tinki.service.impl;
+
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.repository.*;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.MatchmakerService;
+import it.finki.tinki.service.SkillService;
+import it.finki.tinki.service.WorkService;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class WorkServiceImpl implements WorkService {
+
+    JobRepository jobRepository;
+    InternshipRepository internshipRepository;
+    ProjectRepository projectRepository;
+    MatchRepository matchRepository;
+    MatchmakerService matchmakerService;
+    SkillService skillService;
+    AccountService accountService;
+    UserRepository userRepository;
+
+    public WorkServiceImpl(JobRepository jobRepository,
+                           InternshipRepository internshipRepository,
+                           ProjectRepository projectRepository,
+                           MatchRepository matchRepository,
+                           SkillService skillService,
+                           AccountService accountService,
+                           UserRepository userRepository,
+                           MatchmakerService matchmakerService) {
+        this.jobRepository = jobRepository;
+        this.internshipRepository = internshipRepository;
+        this.projectRepository = projectRepository;
+        this.matchRepository = matchRepository;
+        this.skillService = skillService;
+        this.accountService = accountService;
+        this.userRepository = userRepository;
+        this.matchmakerService = matchmakerService;
+    }
+
+    @Override
+    public List<Job> getAllJobsByAccount(Long accId) {
+        return this.jobRepository.findAllByAccount_Id(accId);
+    }
+
+    @Override
+    public List<Internship> getAllInternshipsByAccount(Long accId) {
+        return this.internshipRepository.findAllByAccount_Id(accId);
+    }
+
+    @Override
+    public List<Project> getAllProjectsByAccount(Long accId) {
+        return this.projectRepository.findAllByAccount_Id(accId);
+    }
+
+    @Override
+    public Job insertJob(String title, String description, Long adccId, int salary, List<Long> skillsRequired, AccountType type) {
+        List<Skill> skills = this.skillService.returnSkillsBasedOnId(skillsRequired);
+        Account account = this.accountService.findByIdAndType(adccId, type);
+        Job j = new Job(title, description, account, salary, skills);
+        Job jb = this.jobRepository.save(j);
+
+        List<User> users = this.userRepository.findAll();
+
+        users.forEach(user -> {
+            this.matchmakerService.setUpUserJobMatches(jb, user);
+        });
+
+        return jb;
+    }
+
+    @Override
+    public Internship insertInternship(String title, String description, Long adccId, int salary, List<Long> skillsTrained, int openSpots, AccountType type) {
+        List<Skill> skills = this.skillService.returnSkillsBasedOnId(skillsTrained);
+        Account account = this.accountService.findByIdAndType(adccId, type);
+        Internship j = new Internship(title, description, account, salary, skills, openSpots);
+        Internship jb = this.internshipRepository.save(j);
+
+        List<User> users = this.userRepository.findAll();
+
+        users.forEach(user -> {
+            this.matchmakerService.setUpUserInternshipMatches(jb, user);
+        });
+
+        return jb;
+    }
+
+    @Override
+    public Project insertProject(String title, String description, Long adccId, int salary, List<Long> skillsRequired, Date validUntil, AccountType type) {
+        List<Skill> skills = this.skillService.returnSkillsBasedOnId(skillsRequired);
+        Account account = this.accountService.findByIdAndType(adccId, type);
+        Project j = new Project(title, description, account, salary, skills, validUntil);
+        Project jb = this.projectRepository.save(j);
+
+        List<User> users = this.userRepository.findAll();
+
+        users.forEach(user -> {
+            this.matchmakerService.setUpUserProjectMatches(jb, user);
+        });
+
+        return jb;
+    }
+
+    @Override
+    public Job editJob(Long id, String title, String description, int salary) {
+        Job j = this.jobRepository.findById(id).get();
+
+        j.setTitle(title);
+        j.setDescription(description);
+        j.setSalary(salary);
+
+        return this.jobRepository.save(j);
+    }
+
+    @Override
+    public Internship editInternship(Long id, String title, String description, int salary, int openSpots) {
+        Internship j = this.internshipRepository.findById(id).get();
+
+        j.setTitle(title);
+        j.setDescription(description);
+        j.setSalary(salary);
+        j.setOpenSpots(openSpots);
+
+        return this.internshipRepository.save(j);
+    }
+
+    @Override
+    public Project editProject(Long id, String title, String description, int salary) {
+        Project j = this.projectRepository.findById(id).get();
+
+        j.setTitle(title);
+        j.setDescription(description);
+        j.setSalary(salary);
+
+        return this.projectRepository.save(j);
+    }
+
+    @Override
+    public List<JobResponseDTO> fullTextJobSearch(String text) {
+        List<Skill> skills = this.skillService.returnBasedOnText(text);
+
+        List<Job> jobs = this.jobRepository.findAllByTitleContainsOrDescriptionContains(text,text);
+        List<Job> sjob = new ArrayList<>();
+
+        skills.forEach(skill -> {
+            sjob.addAll(this.jobRepository.findAllBySkillsRequiredContaining(skill));
+        });
+
+        sjob.forEach(job -> {
+            if(!jobs.contains(job)){
+                jobs.add(job);
+            }
+        });
+
+        List<JobResponseDTO> jobs2 = new ArrayList<>();
+
+        jobs.forEach(job -> {
+            jobs2.add(new JobResponseDTO(job));
+        });
+
+        return jobs2;
+    }
+
+    @Override
+    public List<InternshipResponseDTO> fullTextInternshipSearch(String text) {
+        List<Skill> skills = this.skillService.returnBasedOnText(text);
+
+        List<Internship> jobs = this.internshipRepository.findAllByTitleContainsOrDescriptionContains(text,text);
+        List<Internship> sjob = new ArrayList<>();
+
+        skills.forEach(skill -> {
+            sjob.addAll(this.internshipRepository.findAllBySkillsTrainedContaining(skill));
+        });
+
+        sjob.forEach(job -> {
+            if(!jobs.contains(job)){
+                jobs.add(job);
+            }
+        });
+
+        List<InternshipResponseDTO> jobs2 = new ArrayList<>();
+
+        jobs.forEach(job -> {
+            jobs2.add(new InternshipResponseDTO(job));
+        });
+
+        return jobs2;
+    }
+
+    @Override
+    public List<ProjectResponseDTO> fullTextProjectSearch(String text) {
+        List<Skill> skills = this.skillService.returnBasedOnText(text);
+
+        List<Project> jobs = this.projectRepository.findAllByTitleContainsOrDescriptionContains(text,text);
+        List<Project> sjob = new ArrayList<>();
+
+        skills.forEach(skill -> {
+            sjob.addAll(this.projectRepository.findAllBySkillsRequiredContaining(skill));
+        });
+
+        sjob.forEach(job -> {
+            if(!jobs.contains(job)){
+                jobs.add(job);
+            }
+        });
+
+        List<ProjectResponseDTO> jobs2 = new ArrayList<>();
+
+        jobs.forEach(job -> {
+            jobs2.add(new ProjectResponseDTO(job));
+        });
+
+        return jobs2;
+    }
+
+    @Override
+    public Job getJobById(Long id) {
+        return this.jobRepository.findById(id).get();
+    }
+
+    @Override
+    public Internship getInternshipById(Long id) {
+        return this.internshipRepository.findById(id).get();
+    }
+
+    @Override
+    public Project getProjectById(Long id) {
+        return this.projectRepository.findById(id).get();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/AccountEditController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/AccountEditController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/AccountEditController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,83 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Company;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.dto.register.account.CompanyRegisterDTO;
+import it.finki.tinki.model.dto.register.account.TeamRegisterDTO;
+import it.finki.tinki.model.dto.register.account.UserRegisterDTO;
+import it.finki.tinki.model.dto.response.account.CompanyResponseDTO;
+import it.finki.tinki.model.dto.response.account.TeamResponseDTO;
+import it.finki.tinki.model.dto.response.account.UserResponseDTO;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.BuilderService;
+import it.finki.tinki.service.SkillService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Optional;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:3000")
+@RequestMapping(path = "/api/edit/account")
+public class AccountEditController {
+
+    AccountService accountService;
+    SkillService skillService;
+    BuilderService builderService;
+
+    public AccountEditController(AccountService accountService, SkillService skillService, BuilderService builderService) {
+        this.accountService = accountService;
+        this.skillService = skillService;
+        this.builderService = builderService;
+    }
+
+    @PostMapping(path = "/user/{id}/{email}")
+    public UserResponseDTO editUser(@PathVariable(name = "id") Long id,
+                                    @PathVariable(name = "email") String email,
+                                    @RequestBody UserRegisterDTO body){
+
+        Optional<?> a = this.accountService.findByIdAndEmail(id, email, AccountType.USER);
+
+        if(a.isPresent()){
+            List<Skill> retained = this.skillService.returnSkillsBasedOnId(body.getRetainedSkills());
+            List<Skill> toLearn = this.skillService.returnSkillsBasedOnId(body.getSkillsToLearn());
+            User u = this.accountService.editUser(id, body.getEmail(), body.getName(), body.getSurname(), retained, toLearn);
+            return this.builderService.buildUserResponseDTO(u);
+        }
+
+        return new UserResponseDTO();
+    }
+
+    @PostMapping(path = "/company/{id}/{email}")
+    public CompanyResponseDTO editCompany(@PathVariable(name = "id") Long id,
+                                          @PathVariable(name = "email") String email,
+                                          @RequestBody CompanyRegisterDTO body){
+
+        Optional<?> a = this.accountService.findByIdAndEmail(id, email, AccountType.COMPANY);
+
+        if(a.isPresent()){
+            Company c = this.accountService.editCompany(id, body.getEmail(), body.getName(), body.getCountry(), body.getCity(), body.getStreet());
+            return this.builderService.buildCompanyResponseDTO(c);
+        }
+
+        return new CompanyResponseDTO();
+    }
+
+    @PostMapping(path = "/team/{id}/{email}")
+    public TeamResponseDTO editTeam(@PathVariable(name = "id") Long id,
+                                    @PathVariable(name = "email") String email,
+                                    @RequestBody TeamRegisterDTO body){
+
+        Optional<?> a = this.accountService.findByIdAndEmail(id, email, AccountType.TEAM);
+
+        if(a.isPresent()){
+            Team t = this.accountService.editTeam(id, body.getEmail(), body.getName(), body.getMembers());
+            return this.builderService.buildTeamResponseDTO(t);
+        }
+
+        return new TeamResponseDTO();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/AccountRegisterController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/AccountRegisterController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/AccountRegisterController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,76 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.dto.register.account.CompanyRegisterDTO;
+import it.finki.tinki.model.dto.register.account.TeamRegisterDTO;
+import it.finki.tinki.model.dto.register.account.UserRegisterDTO;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.SkillService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:3000")
+@RequestMapping("/api/register")
+public class AccountRegisterController {
+
+    AccountService accountService;
+    SkillService skillService;
+
+    public AccountRegisterController(AccountService accountService, SkillService skillService) {
+        this.accountService = accountService;
+        this.skillService = skillService;
+    }
+
+    @RequestMapping(path = "/user", method = RequestMethod.POST)
+    private Map<String, String> registerUser(@RequestBody UserRegisterDTO body){
+
+        List<Skill> retained = this.skillService.returnSkillsBasedOnId(body.getRetainedSkills());
+        List<Skill> toLearn = this.skillService.returnSkillsBasedOnId(body.getSkillsToLearn());
+        Account k = this.accountService.registerUser(body.getEmail(), body.getPassword(), body.getName(), body.getSurname(), retained, toLearn);
+        Map<String, String> response = new HashMap<>();
+
+        if(k==null){
+            response.put("error", "There was an error when trying to register user.");
+        }else{
+            response.put("success", "Registration completed successfully.");
+        }
+
+        return response;
+    }
+
+    @RequestMapping(path = "/team", method = RequestMethod.POST)
+    private Map<String, String> registerTeam(@RequestBody TeamRegisterDTO body){
+
+        Account k = this.accountService.registerTeam(body.getEmail(), body.getPassword(), body.getName(), body.getMembers());
+        Map<String, String> response = new HashMap<>();
+
+        if(k==null){
+            response.put("error", "There was an error when trying to register team.");
+        }else{
+            response.put("success", "Registration completed successfully.");
+        }
+
+        return response;
+    }
+
+    @RequestMapping(path = "/company", method = RequestMethod.POST)
+    private Map<String, String> registerCompany(@RequestBody CompanyRegisterDTO body){
+
+        Account k = this.accountService.registerCompany(body.getEmail(),
+                body.getPassword(), body.getName(), body.getCountry(), body.getCity(), body.getStreet());
+        Map<String, String> response = new HashMap<>();
+
+        if(k==null){
+            response.put("error", "There was an error when trying to register company.");
+        }else{
+            response.put("success", "Registration completed successfully.");
+        }
+
+        return response;
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/LoginController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/LoginController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/LoginController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,46 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.Users.Team;
+import it.finki.tinki.model.Users.User;
+import it.finki.tinki.model.dto.*;
+import it.finki.tinki.model.dto.response.account.LoginResponseDTO;
+import it.finki.tinki.service.AccountService;
+import it.finki.tinki.service.BuilderService;
+import it.finki.tinki.service.WorkService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:3000")
+@RequestMapping("/api")
+public class LoginController {
+
+    AccountService accountService;
+    BuilderService builderService;
+
+    public LoginController(AccountService accountService, BuilderService builderService) {
+        this.accountService = accountService;
+        this.builderService = builderService;
+    }
+
+    @PostMapping(path = "/login")
+    public LoginResponseDTO loginProcess(@RequestBody AccountLoginDTO body) throws ResponseStatusException {
+
+        Account a1 = accountService.findUser(body.getEmail(), body.getPassword(), body.getType());
+
+        if(a1!=null){
+            if(a1.getClass().equals(User.class)){
+                return this.builderService.buildUserResponseDTO(a1);
+            }else if(a1.getClass().equals(Team.class)){
+                return this.builderService.buildTeamResponseDTO(a1);
+            }else{
+                return this.builderService.buildCompanyResponseDTO(a1);
+            }
+        }
+
+        return new LoginResponseDTO();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/SearchController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/SearchController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/SearchController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,36 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.service.WorkService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin("http://localhost:3000")
+@RequestMapping("/api/search")
+public class SearchController {
+
+    WorkService workService;
+
+    public SearchController(WorkService workService) {
+        this.workService = workService;
+    }
+
+    @GetMapping(path = "/job")
+    public List<JobResponseDTO> jobRes(@RequestParam(name = "text") String text){
+        return this.workService.fullTextJobSearch(text);
+    }
+
+    @GetMapping(path = "/internship")
+    public List<InternshipResponseDTO> internshipRes(@RequestParam(name = "text") String text){
+        return this.workService.fullTextInternshipSearch(text);
+    }
+
+    @GetMapping(path = "/project")
+    public List<ProjectResponseDTO> projectRes(@RequestParam(name = "text") String text){
+        return this.workService.fullTextProjectSearch(text);
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/SkillController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/SkillController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/SkillController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,24 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Skill;
+import it.finki.tinki.service.SkillService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin("http://localhost:3000")
+@RequestMapping("/api/skills")
+public class SkillController {
+
+    SkillService skillService;
+
+    public SkillController(SkillService skillService) {
+        this.skillService = skillService;
+    }
+
+    @GetMapping()
+    public List<Skill> returnSkills(){
+        return this.skillService.findAll();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/WorkEditController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/WorkEditController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/WorkEditController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,79 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.dto.edit.work.InternshipEditDTO;
+import it.finki.tinki.model.dto.edit.work.WorkEditDTO;
+import it.finki.tinki.model.dto.register.work.InternshipRegisterDTO;
+import it.finki.tinki.model.dto.register.work.JobRegisterDTO;
+import it.finki.tinki.model.dto.register.work.ProjectRegisterDTO;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.service.WorkService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:3000")
+@RequestMapping("/api/edit/work")
+public class WorkEditController {
+
+    WorkService workService;
+
+    public WorkEditController(WorkService workService) {
+        this.workService = workService;
+    }
+
+    @PostMapping("/job/{id}")
+    public JobResponseDTO editJob(@PathVariable Long id,
+                                  @RequestBody WorkEditDTO body){
+
+        Job j = this.workService.getJobById(id);
+
+        if(body.getAccountId().equals(j.getAccount().getId())) {
+            Job k = this.workService.editJob(id, body.getTitle(), body.getDescription(), body.getSalary());
+            if(k!=null){
+                return new JobResponseDTO(k);
+            }
+        }
+
+        return new JobResponseDTO();
+    }
+
+    @PostMapping("/internship/{id}")
+    public InternshipResponseDTO editInternship(@PathVariable Long id,
+                                                @RequestBody InternshipEditDTO body){
+
+        Internship i = this.workService.getInternshipById(id);
+
+        if(body.getAccountId().equals(i.getAccount().getId())){
+            Internship k = this.workService.editInternship(id, body.getTitle(), body.getDescription(), body.getSalary(), body.getOpenSpots());
+            if(k!=null){
+                return new InternshipResponseDTO(k);
+            }
+        }
+
+        return new InternshipResponseDTO();
+    }
+
+    @PostMapping("/project/{id}")
+    public ProjectResponseDTO editProject(@PathVariable Long id,
+                                          @RequestBody WorkEditDTO body){
+
+        Project p = this.workService.getProjectById(id);
+
+        if(body.getAccountId().equals(p.getAccount().getId())) {
+            Project k = this.workService.editProject(id, body.getTitle(), body.getDescription(), body.getSalary());
+            if(k!=null){
+                return new ProjectResponseDTO(k);
+            }
+        }
+
+        return new ProjectResponseDTO();
+    }
+}
Index: back_end/src/main/java/it/finki/tinki/web/controller/WorkRegisterController.java
===================================================================
--- back_end/src/main/java/it/finki/tinki/web/controller/WorkRegisterController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/java/it/finki/tinki/web/controller/WorkRegisterController.java	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,62 @@
+package it.finki.tinki.web.controller;
+
+import it.finki.tinki.model.Users.Account;
+import it.finki.tinki.model.Work.Internship;
+import it.finki.tinki.model.Work.Job;
+import it.finki.tinki.model.Work.Project;
+import it.finki.tinki.model.dto.register.work.InternshipRegisterDTO;
+import it.finki.tinki.model.dto.register.work.JobRegisterDTO;
+import it.finki.tinki.model.dto.register.work.ProjectRegisterDTO;
+import it.finki.tinki.model.dto.response.work.InternshipResponseDTO;
+import it.finki.tinki.model.dto.response.work.JobResponseDTO;
+import it.finki.tinki.model.dto.response.work.ProjectResponseDTO;
+import it.finki.tinki.model.enumerator.AccountType;
+import it.finki.tinki.service.WorkService;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:3000")
+@RequestMapping(path = "/api/register/work")
+public class WorkRegisterController {
+
+    WorkService workService;
+
+    public WorkRegisterController(WorkService workService) {
+        this.workService = workService;
+    }
+
+    @PostMapping("/job")
+    public JobResponseDTO registerJob(@RequestBody JobRegisterDTO body){
+
+        if(body.getType() != AccountType.USER){
+            Job j = this.workService.insertJob(body.getTitle(),
+                    body.getDescription(), body.getAccountId(), body.getSalary(), body.getSkillsRequired(), body.getType());
+            return new JobResponseDTO(j);
+        }
+
+        return new JobResponseDTO();
+    }
+
+    @PostMapping("/internship")
+    public InternshipResponseDTO registerInternship(@RequestBody InternshipRegisterDTO body){
+        if(body.getType() == AccountType.COMPANY){
+            Internship j = this.workService.insertInternship(body.getTitle(),
+                    body.getDescription(), body.getAccountId(), body.getSalary(), body.getSkillsTrained(), body.getOpenSpots(), body.getType());
+            return new InternshipResponseDTO(j);
+        }
+
+        return new InternshipResponseDTO();
+    }
+
+    @PostMapping("/project")
+    public ProjectResponseDTO registerProject(@RequestBody ProjectRegisterDTO body){
+
+        if(body.getType() == AccountType.TEAM){
+            Project j = this.workService.insertProject(body.getTitle(),
+                    body.getDescription(), body.getAccountId(), body.getSalary(), body.getSkillsRequired(), body.getValidUntil(), body.getType());
+            return new ProjectResponseDTO(j);
+        }
+
+        return new ProjectResponseDTO();
+    }
+}
Index: back_end/src/main/resources/application-h2.properties
===================================================================
--- back_end/src/main/resources/application-h2.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/resources/application-h2.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,10 @@
+spring.datasource.url=jdbc:h2:mem:testdb
+spring.datasource.driver-class-name=org.h2.Driver
+
+spring.datasource.username=sa
+spring.datasource.password=
+
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+
+spring.h2.console.enabled=true
+spring.h2.console.path=/h2
Index: back_end/src/main/resources/application-prod.properties
===================================================================
--- back_end/src/main/resources/application-prod.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/resources/application-prod.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,9 @@
+spring.datasource.url=jdbc:postgresql://localhost:5432/tinki
+
+spring.datasource.username=tinki
+spring.datasource.password=.
+
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
+
+spring.h2.console.enabled=true
+spring.jpa.hibernate.ddl-auto=update
Index: back_end/src/main/resources/application.properties
===================================================================
--- back_end/src/main/resources/application.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
+++ back_end/src/main/resources/application.properties	(revision 81c9e25dae0f2026f49495317f0a77aa642eb4fa)
@@ -0,0 +1,9 @@
+server.port=9090
+
+spring.profiles.active=prod
+
+spring.jpa.properties.hibernate.show_sql=true
+spring.jpa.properties.hibernate.use_sql_comments=true
+spring.jpa.properties.hibernate.format_sql=true
+
+logging.level.org.hibernate.type=trace
