Job board web app where employers list job vacancies and job seekers apply for positions. Made with ReactJS, TailwindCSS and JAVA. Running back-end on Tomcat and storing data using MySQL RDBMS and administrating it using phpMyAdmin. All parts containerized using Docker and docker compose tool to handle all images, containers, hot reload and other configurations.
- Job board web app
-
First download docker for desktop
-
In CLI run following command:
docker compose -p job-board up --build -d
4 -
In your preferred browser open localhost
Welcome to the Job posting app
If you want to stop docker compose run: docker compose -p job-board down
If you want to use phpMyAdmin
:
- Create container
- in browser open localhost
- login using username
root
and passwordmydbpassword
-
Open yor CLI and start running following commands (one by one)
-
Create docker network
docker network create job-board-net
-
Pull images:
docker pull blagoja95/job-board-mysql-image:v1.0.1
docker pull blagoja95/job-board-tomcat-image:v1.2.0
docker pull blagoja95/job-board-node-image:v1.2.0
docker pull phpmyadmin/phpmyadmin
if you want to use phpmyadmin (optional)
-
Create containers:
docker run -d -p 3306:3306 --name job-board-mysql --net job-board-net -e MYSQL_ROOT_PASSWORD=mydbpassword blagoja95/job-board-mysql-image:v1.0.1
docker run --name job-board-tomcat -d -p 8080:8080 --net job-board-net blagoja95/job-board-tomcat-image:v1.2.0
docker run -dp 3000:3000 --name job-board-node blagoja95/job-board-node-image:v1.2.0
docker run --name phpmyadmin-container --net job-board-net -d -p 8081:80 -e PMA_HOST=job-board-mysql -e PMA_PORT=3306 phpmyadmin/phpmyadmin
(optional)
API 1
/users
get all users
curl localhost:8080/users
/users
with parameters can be used to find specific user
Parameters: id, username, name, email and city.
curl localhost:8080/users?name=GuitarPro%20s.p. GET user GuitarPro
curl localhost:8080/users?email=support@protech.com GET user Langolo
curl localhost:8080/users?city=Banja%20Luka GET users from Banja Luka(encode url!)
Response JSON:
{
"results": 1,
"users": [
{
"city": "Banja Luka",
"name": "GuitarPro",
"about": "Prodajemo gitare!",
"id": 1881,
"email": "info@guitarpro.com",
"username": "guitar22"
}
]
}
/posts
get all posts
curl localhost:8080/posts
Parameters: id, title, city, type and companyID.
curl localhost:8080/posts?city=Banja%20Luka GET posts from Banja Luka(encode url!)
{
"results": 2,
"posts": [
{
"date": "2022-08-15",
"companyID": "1123",
"city": "Banja Luka",
"companyName": "Tritol doo",
"about": "InterPO je u potrazi za strucnim i motivisanim web programerom koji ce se pridruziti na?em timu. Kao web programer u InterPO-u, vasa uloga bice da radite na razvoju i odr?avanju visokokvalitetnih web aplikacija za nase klijente. Va?e zaduzenje ?e obuhvatiti pisanje cistog i efikasnog koda, razumevanje potreba klijenata i kreiranje funkcionalnih i skalabilnih web resenja.",
"qual": "Trazimo osobu koja poseduje iskustvo u programiranju na front-end i\/ili back-endu i koja poznaje razlicite tehnologije kao sto su HTML, CSS, JavaScript, PHP i MySQL. Takodje, vazno nam je da imate iskustvo u radu sa razlicitim razvojnim alatima i okvirima kao sto su React, Angular, Vue.js, Laravel, Symfony i slicno.",
"id": 12301,
"title": "Potreban WEB programer",
"type": "Remote"
},
{
"date": "2023-04-29",
"companyID": "1149",
"city": "Banja Luka",
"companyName": "BestTri",
"about": " ...",
"qual": "- dobro poznavanje rada sa Adobe Ilustratorom i Photoshop-om,\n- osnovno poznavanje rada sa ostalim Adobe alatima\n",
"id": 5848,
"title": "Trazi se Graficki dizajner",
"type": "Remote"
}
]
}
If no user or posts are found, users or posts property with empty array is returned.
curl localhost:8080/users?name=notAnUser
{
"results": 0,
"users": []
}
If using incorrect request following response is returned:
{
"results": 0,
"info": "Wrong request!"
}
The status property can be 0
or 1
. Use this as a binary confirmation of a request success.
The Second property is info
which contains a server response messege.
Login and registration returns three cookies:
username
, userID
, and session cookie JSESSIONID
EXAMPLES:
username=user1;
userid=1022;
JSESSIONID=2962F2F1428377B13A22AC8CDC58E57F;
Register 2
calling /register via POST method is used to create a new user
curl -X POST -v -d "name=MojaKompanija&username=mycomp11&city=Derventa&email=info@mycomp.com&about=empty&password=123456789" localhost:8080/register
```[^3]
If successful this JSON is returned:
{
"register": {
"success": [
"mycomp11",
604
],
"status": 1
}
}
New session is created for newly created user
Login 2
calling /login via POST is used for login authentication
curl -X POST -v -d "username=tritol22&password=123456789" localhost:8080/login
{
"login": {
"success": [
"tritol22",
1123
],
"status": 1
}
}
New session is created for logged user
call /logout to invalidate session
curl -X POST -v -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" localhost:8080/logout
{
"logout": {
"status": 1,
"info": "Successfully logout"
}
}
On login if no user is found following JSON response is returned
{
"login": {
"status": 0,
"info": "There is no user with provided credentials!"
}
}
If password is wrong following JSON response is returned
{
"login": {
"status": 0,
"info": "Incorrect password!"
}
}
Create network request using POST method. MUST BE LOGGED IN
Requested parameters: companyID, companyName, title, type, city, about and qual
curl -X POST -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" -b "userID=641" -d "companyID=641&companyName=Tritol DOO&title=Test title&type=full time&ci
ty=Trebinje&about=Loking for&qual=Java" localhost:8080/posts
If successful response JSON with new post ID will return with success status
{
"posts": {
"id": 8717,
"status": 1
}
}
Delete 3
Create network request using POST method (POST METHOD IS USED TEMPORARY). MUST BE LOGGED IN
Request parameter is id of the desired post or user for delete.
This call requires userID and JSESSIONID cookies.
curl -X POST -b "JSESSIONID=B0F4A3D4373564E825050EEFB9E6999B" -b "userID=641" localhost:8080/posts/delete?id=8063
curl -X POST -b "JSESSIONID=B0F4A3D4373564E825050EEFB9E6999B" -b "userID=641" localhost:8080/users/delete?id=8063
If successful response JSON with number that is greater than zero (rows affected) is return.
{
"posts": {
"status": 1,
"info": "Post successfully deleted!"
}
}
or for user
{
"users": {
"status": 1,
"info": "User successfully deleted!"
}
}
If unsuccessful then zero is return
{
"posts": {
"status": 0,
"info": "Error, check post ID!"
}
}
A user with a userID=1 wants to delete post with a id postID=100 which is post from a user userID=2. This is not allowed.
curl -X DELETE -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" -b "userID=1" localhost:8080/posts?id=100
{
"posts": {
"status": 0,
"info": "Delete action denied!"
}
}
Send POST request on /users/update
or /posts/update
. MUST BE LOGGED IN
Paramaters that can be updated5: name, email, about and city
curl -X POST -d "name=NEW NAME&email=new@new.com&about=...&city=NEW CITY" -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" -b "userID=1123" localhost:8080/users/update
Response JSON:
{
"update": {
"id": 1123,
"status": 1,
"info": "User profile is successfully updated!"
}
}
Let us check result of an update
curl localhost:8080/users?id=1123
Before:
{
"results": 1,
"users": [
{
"city": "Banja Luka",
"name": "Tritol doo",
"about": "Tritol kompanija Banja Luka",
"id": 1123,
"email": "email@tritol.me",
"username": "tritol22"
}
]
}
After update:
{
"results": 1,
"users": [
{
"city": "NEW CITY",
"name": "NEW NAME",
"about": "...",
"id": 1123,
"email": "new@new.com",
"username": "tritol22"
}
]
}
Parameters that can be updated6: title, type, about, city and qual (qualification).
curl -X POST -d "id=10000&title=NEW TITLE&type=NEW TYPE&city=Laktasi&about=...&qual=..." -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" localhost:8080/posts/update
Response JSON:
{
"update": {
"id": 10000,
"status": 1,
"info": "Post is successfully updated!"
}
}
Status property can be 0
or 1
. Use this as a binary confirmation of a request success.
Let us check result of an update
curl localhost:8080/posts?id=10000
Before
{
"results": 1,
"posts": [
{
"date": "2022-12-12",
"companyID": "293",
"city": "Laktasi",
"companyName": "Longolo",
"about": "Trazi se programer sa 2 godine iskustva u java i java script tehnologijama",
"qual": "srednja strucna sprema",
"id": 10000,
"title": "Trazi se programer",
"type": "Stalno zaposlenje"
}
]
}
After update
{
"results": 1,
"posts": [
{
"date": "2022-12-12",
"companyID": "293",
"city": "Laktasi",
"companyName": "Longolo",
"about": "...",
"qual": "...",
"id": 10000,
"title": "NEW TITLE",
"type": "NEW TYPE"
}
]
}
Only owners (and maybe admins issue 63) can update posts.
curl -X POST -d "id=10000&title=NEW TITLE 222&type=NEW TYPE&city=Laktasi&about=...&qual=..." -b "JSESSIONID=E6FA2AABB9D7733C1E6A0841A9265D65" -b "userID=641" localhost:8080/posts/update
{
"update": {
"status": 0,
"info": "Update action denied!"
}
}
Wrong or incorrect requests are handled, and proper response is return in JSON format. These are common responses for all POST requests (Register, Login, Update and Creation of users and posts).
When request is sent without parameters
curl -X POST localhost:8080/login
// or
curl -X POST localhost:8080/register
error JSON response is returned
{
"login": {
"status": 0,
"info": "No parameters provided!"
}
}
or
{
"register": {
"status": 0,
"info": "No parameters provided!"
}
}
If any of parameters is empty string
curl localhost:8080/users?name=Boris&email
Error JSON response is returned
{
"users": {
"status": 0,
"info": "Email is empty!"
}
}
Other examples of JSON formatted response
{
"register": {
"status": 0,
"info": "About is empty!"
}
}
or
{
"update": {
"status": 0,
"info": "Title is empty!"
}
}
If one or more parameters that is required is missing error JSON response is returned.
Following request is missing companyID
parameter and its value:
curl -X POST -b "JSESSIONID=368103A3BCBEBA58D9947BF0E4A0EFBD" -d "companyName=Tritol DOO&title=Test title&type=full time&&city=Trebinje&about=Loking for&ual=Java" localhost:8080/posts
To create a new post these parameters are required.
{
"update": {
"status": 0,
"info": "Some required parameters are missing! Please check documentation!"
}
}
When updating users or posts, or when creating new post and using incorrect (none existing ID 5) following response is returned:
Update of post and user with none existing IDs:
{
"update": {
"status": 0,
"info": "Post with id 1001 does not exist!"
}
}
{
"update": {
"status": 0,
"info": "User with id 1302 does not exist!"
}
}
Example of network request where companyID
(1003) does not exist:
curl -X POST -b "JSESSIONID=368103A3BCBEBA58D9947BF0E4A0EFBD" -d "companyID=1003&companyName=Tritol DOO&title=Test title&type=full time&city=Trebinje&about=Loking for&qual=Java" localhost:8080/posts
{
"posts": {
"status": 0,
"info": "Company with id 1003 does not exist!"
}
}
The following are Session errors:
Trying to create, delete or update w/o being singed in or sending network request w/o required cookies will return error json.
{
"posts": {
"status": 0,
"info": "Missing Cookie!"
}
}
curl -X POST -v -b "JSESSIONID=123" localhost:8080/logout
{
"logout": {
"status": 0,
"info": "You must first be logged in!"
}
}
curl -X DELETE -b "JSESSIONID=2D26293A42268F6E3AEEBF0F406FB83B" localhost:8080/posts?id=1
{
"posts": {
"status": 0,
"info": "UserID cookie is missing!"
}
}
curl -X DELETE -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" localhost:8080/posts?wrong=213
{
"posts": {
"status": 0,
"info": "PostID parameter is missing!"
}
}
curl -X DELETE -b "JSESSIONID=947E1129779927408BCDAF885B462C2D" -b "userID=641" localhost:8080/posts?id=1
{
"posts": {
"status": 0,
"info": "Post with ID 1 is not found!"
}
}
If you found documentation or software errors please feel free to contact me or raise an issue.
Footnotes
-
Currently unsafe! this issue will be addressed in #42 ↩ ↩2 ↩3 ↩4
-
cURL If using curl to test API use -v flag to get response header printed out. Then you can copy cookies and send them back (-b flag) when creating, deleting or updating data. ↩ ↩2
-
Docker compose on linux: command must be run with sudo, if
bootkit
fails or error message appears with invalid host header use commandsudo DOCKER_BUILDKIT=0 docker-compose up -d --build
↩ -
PRONE TO CHANGE What can be updated and how it will be updated will probably be changed in future ↩ ↩2
-
IDs must exist when they are used for update or creation. New Posts use existing
companyID
, update use corresponding IDs for post and user row. ↩