Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: do technical assignment #4

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions technical-test-api/src/main/java/technical/test/api/Interview.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package technical.test.api;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document("interview")
public class Interview {

@Id
private String id;

public String interviewer;

public String interviewee;

public boolean approved = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@EnableMongoRepositories
@EnableMongoRepositories(basePackages = "technical.test.api.repository")
@Configuration
public class MongoDBConfig {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package technical.test.api.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import technical.test.api.Interview;
import technical.test.api.service.InterviewService;

import java.util.List;

@RestController
@RequestMapping("interview")
public class InterviewController {

private final InterviewService interviewService;

public InterviewController(InterviewService interviewService) {
this.interviewService = interviewService;
}

@GetMapping
public ResponseEntity<List<Interview>> getInterviews() {
List<Interview> interviews = interviewService.getInterviews();
return ResponseEntity.ok(interviews);
}

@PostMapping
public ResponseEntity<Interview> createInterview(@RequestBody Interview interview) {
Interview createdInterview = interviewService.createInterview(interview);
return ResponseEntity.ok(createdInterview);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package technical.test.api.repository;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
import technical.test.api.Interview;

@Repository
public interface InterviewRepository extends MongoRepository<Interview, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package technical.test.api.service;

import org.springframework.stereotype.Service;
import technical.test.api.Interview;
import technical.test.api.repository.InterviewRepository;

import java.util.List;

@Service
public class InterviewService {

private final InterviewRepository interviewRepository;

public InterviewService(InterviewRepository interviewRepository) {
this.interviewRepository = interviewRepository;
}

public List<Interview> getInterviews() {
return interviewRepository.findAll();
}

public Interview createInterview(Interview interview) {
return interviewRepository.save(interview);
}
}
1 change: 1 addition & 0 deletions technical-test-front/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^1.4.0",
"core-js": "^3.8.3",
"vue": "^3.2.13"
},
Expand Down
15 changes: 3 additions & 12 deletions technical-test-front/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
<template>
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<InterviewDashboard/>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import InterviewDashboard from "@/components/InterviewDashboard.vue";

export default {
name: 'App',
components: {
HelloWorld
InterviewDashboard
}
}
</script>

<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
58 changes: 0 additions & 58 deletions technical-test-front/src/components/HelloWorld.vue

This file was deleted.

124 changes: 124 additions & 0 deletions technical-test-front/src/components/InterviewDashboard.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<script>
import axios from 'axios'

export default {
name: 'InterviewDashboard',
data () {
return {
interviews: [],
newInterview: {}
}
},

methods: {
loadInterviews () {
axios.get('/interview')
.then((response) => {
this.interviews = response.data
})
},

addInterview () {
axios.post('/interview', this.newInterview)
.then((response) => {
const addedInterview = response.data
this.interviews.push(addedInterview)
})
this.newInterview = {}
}
},

computed: {
atLeastOneInterviewFound () {
return this.interviews && this.interviews.length > 0
}
},

mounted() {
this.loadInterviews()
}
}
</script>

<template>
<div class="interview-bloc">
<h1>All interviews</h1>
<div v-if="atLeastOneInterviewFound">
<table>
<tr>
<th>Index</th>
<th>Id</th>
<th>Interviewer</th>
<th>Interviewee</th>
<th>Approved ?</th>
</tr>
<tr v-for="(interview, index) in interviews" :key="interview.id">
<td>{{index}}</td>
<td>{{interview.id}}</td>
<td>{{interview.interviewer}}</td>
<td>{{interview.interviewee}}</td>
<td>{{interview.approved}}</td>
</tr>
</table>
</div>
<div v-else>No interview found!</div>
</div>

<div class="separator"></div>

<div class="interview-bloc">
<h1>Add a new interview:</h1>
<label for="interviewer-name">Interviewer name:</label><input type="text" id="interviewer-name" v-model="newInterview.interviewer" placeholder="Type the interviewer name"/><br/>
<label for="interviewee-name">Interviewee name:</label><input type="text" id="interviewee-name" v-model="newInterview.interviewee" placeholder="Type the interviewee name"/><br/>
<label for="approved-interview">Has been approved ?</label><input type="checkbox" id="approved-interview" v-model="newInterview.approved"/><br/>
<button @click="addInterview">Create new interview</button>
</div>

</template>

<style scoped>

table, th, td {
border: 1px solid;
}

table {
width: 100%;
border-collapse: collapse;
}

.interview-bloc {
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
}

.separator {
margin: 20px;
}

input[type=text] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}

button {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
}

button:hover {
background-color: #45a049;
}
</style>
5 changes: 4 additions & 1 deletion technical-test-front/vue.config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
transpileDependencies: true,
devServer: {
proxy: 'http://localhost:8080'
}
})