From f7b2b189b3439005eb3a3f64350542fb6311a397 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Sun, 6 Jul 2025 14:04:19 +0300 Subject: [PATCH] Implement user-specific tutorial retrieval and enhance authentication details --- .../main.component/main.component.ts | 1 + .../src/app/services/tutorial.service.ts | 2 ++ .../tutorials-list.component.html | 26 ++++++++++++-- .../tutorials-list.component.scss | 3 ++ .../tutorials-list.component.ts | 35 +++++++++++++++++-- .../app/user-module/user-api.service.spec.ts | 16 +++++++++ .../src/app/user-module/user-api.service.ts | 19 ++++++++++ .../controllers/TutorialController.java | 28 +++++++++++++++ .../repository/TutorialRepository.java | 1 + .../security/AuthenticationFacade.java | 13 +++++++ .../security/IAuthenticationFacade.java | 3 ++ .../jambotron/security/WebSecurityConfig.java | 2 +- 12 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 jambotron-ui/src/app/user-module/user-api.service.spec.ts create mode 100644 jambotron-ui/src/app/user-module/user-api.service.ts diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts index 86d226c..e176e61 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.ts +++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts @@ -142,6 +142,7 @@ export class MainComponent implements OnInit{ //window.location.reload(); this.router.navigate([environment.default_page]); + window.location.reload(); }, error: err => { console.log(err); diff --git a/jambotron-ui/src/app/services/tutorial.service.ts b/jambotron-ui/src/app/services/tutorial.service.ts index 9725c8c..b967abd 100644 --- a/jambotron-ui/src/app/services/tutorial.service.ts +++ b/jambotron-ui/src/app/services/tutorial.service.ts @@ -17,6 +17,8 @@ export class TutorialService { return this.http.get(baseUrl); } + + get(id: any): Observable { return this.http.get(`${baseUrl}/${id}`); } diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html index 088d130..9af23ff 100644 --- a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html @@ -1,6 +1,26 @@

tutorials-list.component works!

- Item 1 - Item 2 - Item 3 + @for (tutorial of tutorials; track tutorial) { + + +
+ {{tutorial.title}} + + X +
+
+ } +
diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss index e69de29..d37713e 100644 --- a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss @@ -0,0 +1,3 @@ +.spacer{ + flex: 1 1 auto; +} diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts index 6b34a98..77d4c94 100644 --- a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts @@ -1,15 +1,46 @@ -import { Component } from '@angular/core'; +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {MatList, MatListItem} from '@angular/material/list'; +import {Tutorial} from '../../models/tutorial.model'; +import {TutorialService} from '../../services/tutorial.service'; +import {UserApiService} from '../user-api.service'; +import {MatButton} from '@angular/material/button'; +import {MatLine, MatOption} from '@angular/material/core'; +import {MatIcon} from '@angular/material/icon'; @Component({ selector: 'app-tutorials-list.component', imports: [ MatList, - MatListItem + MatListItem, + MatLine, + MatButton, + MatIcon, + MatOption ], + schemas:[CUSTOM_ELEMENTS_SCHEMA], templateUrl: './tutorials-list.component.html', styleUrl: './tutorials-list.component.scss' }) export class TutorialsListComponent { + tutorials?: Tutorial[]; + constructor(private userApiService: UserApiService) { + this.retrieveTutorials(); + } + + retrieveTutorials(): void { + this.userApiService.getUserAllTutorials() + .subscribe( + data => { + this.tutorials = data; + console.log(data); + }, + error => { + console.log(error); + }); + } + + deleteOption($event: MouseEvent, option: any) { + + } } diff --git a/jambotron-ui/src/app/user-module/user-api.service.spec.ts b/jambotron-ui/src/app/user-module/user-api.service.spec.ts new file mode 100644 index 0000000..17ce238 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user-api.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserApiService } from './user-api.service'; + +describe('UserApiService', () => { + let service: UserApiService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UserApiService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/user-api.service.ts b/jambotron-ui/src/app/user-module/user-api.service.ts new file mode 100644 index 0000000..7d6226b --- /dev/null +++ b/jambotron-ui/src/app/user-module/user-api.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import {Observable} from 'rxjs'; +import {Tutorial} from '../models/tutorial.model'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class UserApiService { + baseUrl = 'http://localhost:8080/api/user'; + + constructor(private http: HttpClient) { + + } + + getUserAllTutorials(): Observable { + return this.http.get(`${this.baseUrl}/tutorials`); + } +} diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/TutorialController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/TutorialController.java index 4ae9c22..8ea36ce 100644 --- a/src/main/java/com/jambotronGroup/jambotron/controllers/TutorialController.java +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/TutorialController.java @@ -37,6 +37,34 @@ public class TutorialController { @Autowired TutorialRepository tutorialRepository; + @GetMapping("/user/tutorials") + public ResponseEntity> getUserTutorials(@RequestParam(required = false) String title) { + try { + List tutorials = new ArrayList(); + + User user = userRepository.findById(authenticationFacade.getUserDetails().getId()).get(); + + + if(title == null){ + // If no title is provided, return all tutorials for the user + tutorialRepository.findByUserId(user.getId()).forEach(tutorials::add); + } else { + // If a title is provided, filter tutorials by user and title + tutorialRepository.findByUserIdAndTitle(user.getId(), title).forEach(tutorials::add); + } + + if (tutorials.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(tutorials, HttpStatus.OK); + + } catch (Exception e) { + e.printStackTrace(); + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/tutorials") public ResponseEntity> getAllTutorials(@RequestParam(required = false) String title) { try { diff --git a/src/main/java/com/jambotronGroup/jambotron/repository/TutorialRepository.java b/src/main/java/com/jambotronGroup/jambotron/repository/TutorialRepository.java index c11736b..209b1b2 100644 --- a/src/main/java/com/jambotronGroup/jambotron/repository/TutorialRepository.java +++ b/src/main/java/com/jambotronGroup/jambotron/repository/TutorialRepository.java @@ -12,6 +12,7 @@ import java.util.List; public interface TutorialRepository extends JpaRepository { List findByUserId(Long userId); + List findByUserIdAndTitle(Long userId, String title); List findByPublished(boolean published); List findByTitleContaining(String title); } \ No newline at end of file diff --git a/src/main/java/com/jambotronGroup/jambotron/security/AuthenticationFacade.java b/src/main/java/com/jambotronGroup/jambotron/security/AuthenticationFacade.java index e0aef45..2565d5c 100644 --- a/src/main/java/com/jambotronGroup/jambotron/security/AuthenticationFacade.java +++ b/src/main/java/com/jambotronGroup/jambotron/security/AuthenticationFacade.java @@ -1,7 +1,9 @@ package com.jambotronGroup.jambotron.security; +import com.jambotronGroup.jambotron.security.services.UserDetailsImpl; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; @Component @@ -12,5 +14,16 @@ public class AuthenticationFacade implements IAuthenticationFacade { return SecurityContextHolder.getContext().getAuthentication(); } + + @Override + public UserDetailsImpl getUserDetails() { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + + return (UserDetailsImpl) userDetails; + } + + } diff --git a/src/main/java/com/jambotronGroup/jambotron/security/IAuthenticationFacade.java b/src/main/java/com/jambotronGroup/jambotron/security/IAuthenticationFacade.java index 6145de9..1db514b 100644 --- a/src/main/java/com/jambotronGroup/jambotron/security/IAuthenticationFacade.java +++ b/src/main/java/com/jambotronGroup/jambotron/security/IAuthenticationFacade.java @@ -1,7 +1,10 @@ package com.jambotronGroup.jambotron.security; +import com.jambotronGroup.jambotron.security.services.UserDetailsImpl; import org.springframework.security.core.Authentication; public interface IAuthenticationFacade { Authentication getAuthentication(); + + UserDetailsImpl getUserDetails(); } \ No newline at end of file diff --git a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java index 5fc4c7c..962deb0 100644 --- a/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java +++ b/src/main/java/com/jambotronGroup/jambotron/security/WebSecurityConfig.java @@ -116,7 +116,7 @@ public class WebSecurityConfig implements WebMvcConfigurer {// extends WebSecuri .requestMatchers("/main/**").permitAll() .requestMatchers("/api/test/**").permitAll() - .requestMatchers("/api/tutorials").hasRole("ADMIN") + //.requestMatchers("/api/tutorials").hasRole("ADMIN") .requestMatchers("/api/zhipuai/image/**").permitAll()