adding members management
This commit is contained in:
		@ -1,5 +1,6 @@
 | 
				
			|||||||
package ovh.herisson.Clyde.EndPoints.Msg;
 | 
					package ovh.herisson.Clyde.EndPoints.Msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.http.HttpStatus;
 | 
					import org.springframework.http.HttpStatus;
 | 
				
			||||||
import org.springframework.http.ResponseEntity;
 | 
					import org.springframework.http.ResponseEntity;
 | 
				
			||||||
import org.springframework.web.bind.annotation.CrossOrigin;
 | 
					import org.springframework.web.bind.annotation.CrossOrigin;
 | 
				
			||||||
@ -13,9 +14,11 @@ import org.springframework.web.bind.annotation.RestController;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import lombok.AllArgsConstructor;
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
import ovh.herisson.Clyde.DTO.Msg.DiscussionDTO;
 | 
					import ovh.herisson.Clyde.DTO.Msg.DiscussionDTO;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Repositories.UserRepository;
 | 
				
			||||||
import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository;
 | 
					import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository;
 | 
				
			||||||
import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
 | 
					import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
 | 
				
			||||||
import ovh.herisson.Clyde.Services.AuthenticatorService;
 | 
					import ovh.herisson.Clyde.Services.AuthenticatorService;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Services.UserService;
 | 
				
			||||||
import ovh.herisson.Clyde.Services.Msg.DiscussionService;
 | 
					import ovh.herisson.Clyde.Services.Msg.DiscussionService;
 | 
				
			||||||
import ovh.herisson.Clyde.Tables.User;
 | 
					import ovh.herisson.Clyde.Tables.User;
 | 
				
			||||||
import ovh.herisson.Clyde.Tables.Msg.Discussion;
 | 
					import ovh.herisson.Clyde.Tables.Msg.Discussion;
 | 
				
			||||||
@ -29,6 +32,7 @@ public class MessagesController {
 | 
				
			|||||||
	private AuthenticatorService authServ;
 | 
						private AuthenticatorService authServ;
 | 
				
			||||||
	private DiscussionService discServ;
 | 
						private DiscussionService discServ;
 | 
				
			||||||
	private DiscussionRepository discRepo;
 | 
						private DiscussionRepository discRepo;
 | 
				
			||||||
 | 
						private UserService userServ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@GetMapping("/discussions")
 | 
						@GetMapping("/discussions")
 | 
				
			||||||
	public ResponseEntity<Iterable<Discussion>> getDiscussions(@RequestHeader("Authorization") String token ){
 | 
						public ResponseEntity<Iterable<Discussion>> getDiscussions(@RequestHeader("Authorization") String token ){
 | 
				
			||||||
@ -60,6 +64,20 @@ public class MessagesController {
 | 
				
			|||||||
		return new ResponseEntity<>(disc, HttpStatus.OK);
 | 
							return new ResponseEntity<>(disc, HttpStatus.OK);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@PatchMapping("/discussion/{id}/add")
 | 
				
			||||||
 | 
						public ResponseEntity<Discussion> AlterDiscussion(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody User data){
 | 
				
			||||||
 | 
							User user = authServ.getUserFromToken(token);
 | 
				
			||||||
 | 
							if(user == null){
 | 
				
			||||||
 | 
								return new UnauthorizedResponse<>(null);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Discussion disc = discRepo.findById(id).orElse(null);
 | 
				
			||||||
 | 
							User invited = userServ.getUserById(data.getRegNo());
 | 
				
			||||||
 | 
							disc.addMember(invited);
 | 
				
			||||||
 | 
							discRepo.save(disc);
 | 
				
			||||||
 | 
							return new ResponseEntity<>(disc, HttpStatus.OK);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@PostMapping("/discussion/{id}")
 | 
						@PostMapping("/discussion/{id}")
 | 
				
			||||||
	public ResponseEntity<Discussion> sendMessage(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Message msg){
 | 
						public ResponseEntity<Discussion> sendMessage(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Message msg){
 | 
				
			||||||
		User user = authServ.getUserFromToken(token);
 | 
							User user = authServ.getUserFromToken(token);
 | 
				
			||||||
 | 
				
			|||||||
@ -51,4 +51,8 @@ public class Discussion{
 | 
				
			|||||||
		msg.setDiscussion(this);
 | 
							msg.setDiscussion(this);
 | 
				
			||||||
		msgs.add(msg);
 | 
							msgs.add(msg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void addMember(User user) {
 | 
				
			||||||
 | 
							members.add(user);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,11 +2,13 @@ package ovh.herisson.Clyde.Tables.Msg;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
					import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import jakarta.persistence.CascadeType;
 | 
				
			||||||
import jakarta.persistence.Entity;
 | 
					import jakarta.persistence.Entity;
 | 
				
			||||||
import jakarta.persistence.GeneratedValue;
 | 
					import jakarta.persistence.GeneratedValue;
 | 
				
			||||||
import jakarta.persistence.GenerationType;
 | 
					import jakarta.persistence.GenerationType;
 | 
				
			||||||
import jakarta.persistence.Id;
 | 
					import jakarta.persistence.Id;
 | 
				
			||||||
import jakarta.persistence.ManyToOne;
 | 
					import jakarta.persistence.ManyToOne;
 | 
				
			||||||
 | 
					import jakarta.persistence.OneToMany;
 | 
				
			||||||
import jakarta.persistence.OneToOne;
 | 
					import jakarta.persistence.OneToOne;
 | 
				
			||||||
import lombok.AllArgsConstructor;
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
import lombok.Getter;
 | 
					import lombok.Getter;
 | 
				
			||||||
@ -26,7 +28,7 @@ public class Message {
 | 
				
			|||||||
	private long id;
 | 
						private long id;
 | 
				
			||||||
	private String content; 
 | 
						private String content; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@OneToOne
 | 
						@ManyToOne
 | 
				
			||||||
	private User author;
 | 
						private User author;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public User getAuthor() {
 | 
						public User getAuthor() {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ package ovh.herisson.Clyde.Tables;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import jakarta.persistence.*;
 | 
					import jakarta.persistence.*;
 | 
				
			||||||
import ovh.herisson.Clyde.Tables.Msg.Discussion;
 | 
					import ovh.herisson.Clyde.Tables.Msg.Discussion;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.Msg.Message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Date;
 | 
					import java.util.Date;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@ -24,6 +25,11 @@ public class User {
 | 
				
			|||||||
    private ovh.herisson.Clyde.Tables.Role role;
 | 
					    private ovh.herisson.Clyde.Tables.Role role;
 | 
				
			||||||
    private String password;
 | 
					    private String password;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						////// Extension Messagerie /////
 | 
				
			||||||
 | 
						@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
 | 
				
			||||||
 | 
						private List<Message> msgs;
 | 
				
			||||||
 | 
						/////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@ManyToMany( mappedBy = "members" )
 | 
						@ManyToMany( mappedBy = "members" )
 | 
				
			||||||
	private List<Discussion> discussions;
 | 
						private List<Discussion> discussions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -7,9 +7,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
	import { ref, reactive } from 'vue'
 | 
						import { ref, reactive } from 'vue'
 | 
				
			||||||
	import { discussionsList, currentDiscussion, fetchDiscussion, createDiscussion, sendMessage, updateDiscussionName} from '@/rest/msg.js'
 | 
						import { discussionsList, currentDiscussion, fetchDiscussion, createDiscussion, sendMessage, updateDiscussionName, invite} from '@/rest/msg.js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const msgContent = ref("");
 | 
						const msgContent = ref("");
 | 
				
			||||||
 | 
						const addMember = ref(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -19,8 +20,8 @@
 | 
				
			|||||||
			<div @click="fetchDiscussion(discussion.id)" class="discItem" v-for="discussion in discussionsList" :key="discussion.id">{{ discussion.name }}</div>
 | 
								<div @click="fetchDiscussion(discussion.id)" class="discItem" v-for="discussion in discussionsList" :key="discussion.id">{{ discussion.name }}</div>
 | 
				
			||||||
			<button id="createDiscussion" @click="createDiscussion('New Discussion')">+</button>
 | 
								<button id="createDiscussion" @click="createDiscussion('New Discussion')">+</button>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<div id="discussion">
 | 
							<div id="discussion" v-if="currentDiscussion.length != 0">
 | 
				
			||||||
			<h1 id=msgName ><input class="InputTitle" type="text" @blur="updateDiscussionName(currentDiscussion.id, currentDiscussion.name)" v-model="currentDiscussion.name"></h1>
 | 
								<h1 id=msgName ><input class="InputTitle" type="text" @change="updateDiscussionName(currentDiscussion.id, currentDiscussion.name)" v-model="currentDiscussion.name"></h1>
 | 
				
			||||||
			<div id=msgs>
 | 
								<div id=msgs>
 | 
				
			||||||
				<div class="msg" v-for="msg in currentDiscussion.msgs" :sender="msg.sender" :key="msg.id">
 | 
									<div class="msg" v-for="msg in currentDiscussion.msgs" :sender="msg.sender" :key="msg.id">
 | 
				
			||||||
					{{ msg.content }}
 | 
										{{ msg.content }}
 | 
				
			||||||
@ -31,6 +32,10 @@
 | 
				
			|||||||
				<input type="submit" @click="sendMessage(currentDiscussion.id, msgContent, null)" value="send">
 | 
									<input type="submit" @click="sendMessage(currentDiscussion.id, msgContent, null)" value="send">
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 | 
							<div id="members" v-if="currentDiscussion.length != 0">
 | 
				
			||||||
 | 
								<div class="memberItem" v-for="member in currentDiscussion.members" :key="member.id">{{ member.firstName }} {{ member.lastName.toUpperCase() }}</div>
 | 
				
			||||||
 | 
								<input type=text id="addMembers" @focus="addMember = true" @blur="addMember = false;$event.target.value = ''" @change="invite(currentDiscussion.id, $event.target.value)" :placeholder="addMember ? 'Regno' : '+'"/>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -42,7 +47,7 @@ div#msg{
 | 
				
			|||||||
	height: 100%;
 | 
						height: 100%;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	display: grid;
 | 
						display: grid;
 | 
				
			||||||
	grid-template-columns: 20% auto;
 | 
						grid-template-columns: 20% auto 10%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div#discList{
 | 
					div#discList{
 | 
				
			||||||
@ -53,7 +58,17 @@ div#discList{
 | 
				
			|||||||
	padding: 10px;
 | 
						padding: 10px;
 | 
				
			||||||
	display: flex;
 | 
						display: flex;
 | 
				
			||||||
	flex-direction: column;
 | 
						flex-direction: column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div#members{
 | 
				
			||||||
 | 
						margin: 30px 0;
 | 
				
			||||||
 | 
						border-radius: 10px 0 0 10px;
 | 
				
			||||||
 | 
						background-color: red;
 | 
				
			||||||
 | 
						background-color: rgba(255, 255, 255, 0.05);
 | 
				
			||||||
 | 
						overflow: hidden;
 | 
				
			||||||
 | 
						display: flex;
 | 
				
			||||||
 | 
						padding: 10px 0 0 10px;
 | 
				
			||||||
 | 
						flex-direction: column;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.InputTitle{
 | 
					.InputTitle{
 | 
				
			||||||
@ -74,6 +89,19 @@ div#discList{
 | 
				
			|||||||
	border: 1px solid darkorange;
 | 
						border: 1px solid darkorange;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.memberItem{
 | 
				
			||||||
 | 
						color: darkorange;
 | 
				
			||||||
 | 
						display: flex;
 | 
				
			||||||
 | 
						font-family: sans-serif;
 | 
				
			||||||
 | 
						font-weight: bold;
 | 
				
			||||||
 | 
						height: 4vh;
 | 
				
			||||||
 | 
						margin: 5px;
 | 
				
			||||||
 | 
						border-radius: 30px 0 0 30px;
 | 
				
			||||||
 | 
						align-items: center;
 | 
				
			||||||
 | 
						justify-content: center;
 | 
				
			||||||
 | 
						border: 1px solid darkorange;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#createDiscussion{
 | 
					#createDiscussion{
 | 
				
			||||||
	height: 4vh;
 | 
						height: 4vh;
 | 
				
			||||||
	margin: 5px;
 | 
						margin: 5px;
 | 
				
			||||||
@ -84,6 +112,17 @@ div#discList{
 | 
				
			|||||||
	font-weight: 900;
 | 
						font-weight: 900;
 | 
				
			||||||
	font-size: 2em;
 | 
						font-size: 2em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#addMembers{
 | 
				
			||||||
 | 
						height: 4vh;
 | 
				
			||||||
 | 
						margin: 5px;
 | 
				
			||||||
 | 
						text-align: center;
 | 
				
			||||||
 | 
						color: white;
 | 
				
			||||||
 | 
						background-color: green;
 | 
				
			||||||
 | 
						border-radius: 30px 0 0 30px;
 | 
				
			||||||
 | 
						border: none;
 | 
				
			||||||
 | 
						font-weight: 900;
 | 
				
			||||||
 | 
						font-size: 2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
div#discussion{
 | 
					div#discussion{
 | 
				
			||||||
	display: flex;
 | 
						display: flex;
 | 
				
			||||||
 | 
				
			|||||||
@ -13,8 +13,8 @@ import { ref } from 'vue'
 | 
				
			|||||||
 * - name
 | 
					 * - name
 | 
				
			||||||
 * - members
 | 
					 * - members
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const discussionsList = ref({});
 | 
					export const discussionsList = ref();
 | 
				
			||||||
export const currentDiscussion = ref({});
 | 
					export const currentDiscussion = ref([]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function createDiscussion(name){
 | 
					export async function createDiscussion(name){
 | 
				
			||||||
@ -24,7 +24,7 @@ export async function createDiscussion(name){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function invite(id, regNo){
 | 
					export async function invite(id, regNo){
 | 
				
			||||||
	restPost("/discussion/"+ id+ "/invite", {user: regNo});
 | 
						restPatch("/discussion/"+ id+ "/add", {regNo: parseInt(regNo)}).then(() => fetchDiscussion(id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function sendMessage(id, content, responseId){
 | 
					export async function sendMessage(id, content, responseId){
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user