This is a basic database scheme with users, user emails, and user roles. This Java Spring REST API application will provide endpoints for clients to read various data sets contained in the application's data. This application will also form the basis of a user authentication application developed elsewhere in the course
The table layout is similar to the initial version with the following exceptions:
- The join table userroles is explicitly created. This allows us to add additional columns to the join table
- Since we are creating the join table ourselves, the Many to Many relationship that formed the join table is now two Many to One relationships
- All tables now have audit fields
Thus the new table layout is as follows
- User is the driving table.
- Useremails have a Many-To-One relationship with User. Each User has many user email combinations. Each user email combination has only one User.
- Roles have a Many-To-Many relationship with Users.
Using the provided seed data, expand each endpoint below to see the output it generates.
http://localhost:2019/useremails/useremails
[
{
"useremailid": 5,
"useremail": "admin@email.local",
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 3,
"name": "DATA"
}
},
{
"role": {
"roleid": 1,
"name": "ADMIN"
}
},
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
}
},
{
"useremailid": 6,
"useremail": "admin@mymail.local",
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 3,
"name": "DATA"
}
},
{
"role": {
"roleid": 1,
"name": "ADMIN"
}
},
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
}
},
{
"useremailid": 8,
"useremail": "cinnamon@mymail.local",
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
},
{
"useremailid": 9,
"useremail": "hops@mymail.local",
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
},
{
"useremailid": 10,
"useremail": "bunny@email.local",
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
},
{
"useremailid": 12,
"useremail": "barnbarn@email.local",
"user": {
"userid": 11,
"username": "barnbarn",
"primaryemail": "barnbarn@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
}
}
]
http://localhost:2019/useremails/useremail/8
{
"useremailid": 8,
"useremail": "cinnamon@mymail.local",
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
}
DELETE http://localhost:2019/useremails/useremail/8
No Body Data
Status OK
PUT http://localhost:2019/useremails/useremail/9/email/favbun@hops.local
OUTPUT
Status OK
http://localhost:2019/useremails/useremail/9
{
"useremailid": 9,
"useremail": "favbun@hops.local",
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
}
POST http://localhost:2019/useremails/user/14/email/favbun@hops.local
OUTPUT
Status CREATED
Location Header: http://localhost:2019/useremails/useremail/15
http://localhost:2019/useremails/useremail/15
{
"useremailid": 15,
"useremail": "favbun@hops.local",
"user": {
"userid": 14,
"username": "misskitty",
"primaryemail": "misskitty@school.lambda",
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
}
}
http://localhost:2019/roles/roles
[
{
"roleid": 1,
"name": "ADMIN",
"users": [
{
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
]
}
}
]
},
{
"roleid": 2,
"name": "USER",
"users": [
{
"user": {
"userid": 14,
"username": "misskitty",
"primaryemail": "misskitty@school.lambda",
"useremails": [
{
"useremailid": 15,
"useremail": "favbun@hops.local"
}
]
}
},
{
"user": {
"userid": 13,
"username": "puttat",
"primaryemail": "puttat@school.lambda",
"useremails": []
}
},
{
"user": {
"userid": 11,
"username": "barnbarn",
"primaryemail": "barnbarn@lambdaschool.local",
"useremails": [
{
"useremailid": 12,
"useremail": "barnbarn@email.local"
}
]
}
},
{
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
]
}
},
{
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
]
}
}
]
},
{
"roleid": 3,
"name": "DATA",
"users": [
{
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
]
}
},
{
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
]
}
}
]
}
]
http://localhost:2019/roles/role/3
{
"roleid": 3,
"name": "DATA",
"users": [
{
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
]
}
},
{
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
]
}
}
]
}
http://localhost:2019/roles/role/name/data
{
"roleid": 3,
"name": "DATA",
"users": [
{
"user": {
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
]
}
},
{
"user": {
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
]
}
}
]
}
POST http://localhost:2019/roles/role
DATA
{
"name" : "ANewRole"
}
OUTPUT
Status CREATED
Location Header: http://localhost:2019/roles/role/16
http://localhost:2019/roles/role/name/anewrole
{
"roleid": 16,
"name": "ANEWROLE",
"users": []
}
PUT http://localhost:2019/roles/role/16
DATA
{
"name" : "ANewRole"
}
OUTPUT
Status OK
http://localhost:2019/users/users
[
{
"userid": 4,
"username": "admin",
"primaryemail": "admin@lambdaschool.local",
"useremails": [
{
"useremailid": 5,
"useremail": "admin@email.local"
},
{
"useremailid": 6,
"useremail": "admin@mymail.local"
}
],
"roles": [
{
"role": {
"roleid": 3,
"name": "DATA"
}
},
{
"role": {
"roleid": 1,
"name": "ADMIN"
}
},
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
},
{
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
},
{
"userid": 11,
"username": "barnbarn",
"primaryemail": "barnbarn@lambdaschool.local",
"useremails": [
{
"useremailid": 12,
"useremail": "barnbarn@email.local"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
},
{
"userid": 13,
"username": "puttat",
"primaryemail": "puttat@school.lambda",
"useremails": [],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
},
{
"userid": 14,
"username": "misskitty",
"primaryemail": "misskitty@school.lambda",
"useremails": [
{
"useremailid": 15,
"useremail": "favbun@hops.local"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
}
]
}
]
http://localhost:2019/users/user/7
{
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
http://localhost:2019/users/user/name/cinnamon
{
"userid": 7,
"username": "cinnamon",
"primaryemail": "cinnamon@lambdaschool.local",
"useremails": [
{
"useremailid": 9,
"useremail": "favbun@hops.local"
},
{
"useremailid": 10,
"useremail": "bunny@email.local"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
http://localhost:2019/users/user/name/like/da
[]
POST http://localhost:2019/users/user
DATA
{
"username": "Mojo",
"primaryemail": "mojo@lambdaschool.local",
"password" : "Coffee123",
"useremails": [
{
"useremail": "mojo@mymail.local"
},
{
"useremail": "mojo@email.local"
}
],
"roles": [
{
"role": {
"roleid": 1
}
},
{
"role": {
"roleid": 2
}
}
]
}
OUTPUT
No Body Data
Location Header: http://localhost:2019/users/user/17
Status 201 Created
http://localhost:2019/users/user/name/mojo
PUT http://localhost:2019/users/user/14
DATA
{
"username": "stumps",
"primaryemail": "stumps@lambdaschool.local",
"password" : "EarlGray123",
"useremails": [
{
"useremail": "stumps@mymail.local"
},
{
"useremail": "stumps@email.local"
}
],
"roles": [
{
"role": {
"roleid": 3
}
},
{
"role": {
"roleid": 1
}
}
]
}
OUTPUT
No Body Data
Status OK
http://localhost:2019/users/user/name/stumps
{
"userid": 16,
"username": "stumps",
"primaryemail": "stumps@lambdaschool.local",
"useremails": [
{
"useremailid": 19,
"useremail": "stumps@mymail.local"
},
{
"useremailid": 20,
"useremail": "stumps@email.local"
}
],
"roles": [
{
"role": {
"roleid": 1,
"name": "ADMIN"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
PATCH http://localhost:2019/users/user/7
DATA
{
"username": "cinabun",
"primaryemail": "cinabun@lambdaschool.home",
"useremails": [
{
"useremail": "cinnamon@mymail.home"
},
{
"useremail": "hops@mymail.home"
},
{
"useremail": "bunny@email.home"
}
]
}
OUTPUT
No Body Data
Status OK
http://localhost:2019/users/user/name/cinabun
{
"userid": 7,
"username": "cinabun",
"primaryemail": "cinabun@lambdaschool.home",
"useremails": [
{
"useremailid": 21,
"useremail": "cinnamon@mymail.home"
},
{
"useremailid": 22,
"useremail": "hops@mymail.home"
},
{
"useremailid": 23,
"useremail": "bunny@email.home"
}
],
"roles": [
{
"role": {
"roleid": 2,
"name": "USER"
}
},
{
"role": {
"roleid": 3,
"name": "DATA"
}
}
]
}
DELETE http://localhost:2019/users/user/14
No Body Data
Status OK