├── .github └── workflows │ └── maven.yml ├── Dockerfile ├── RBAC.md ├── README.md ├── deployment-service.yml ├── pom.xml ├── sonar-project.properties └── src ├── main ├── java │ └── com │ │ └── example │ │ └── todo │ │ ├── App.java │ │ ├── TaskMasterProApplication.java │ │ ├── config │ │ └── SecurityConfig.java │ │ ├── controller │ │ ├── TodoController.java │ │ └── UserController.java │ │ ├── model │ │ ├── Todo.java │ │ └── User.java │ │ ├── repository │ │ ├── TodoRepository.java │ │ └── UserRepository.java │ │ └── service │ │ └── UserDetailsServiceImpl.java └── resources │ ├── application.properties │ └── templates │ ├── index.html │ ├── login.html │ └── signup.html └── test └── java └── com └── example └── todo └── AppTest.java /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | name: CDPROD 4 | 5 | on: 6 | push: 7 | branches: [ "main" ] 8 | pull_request: 9 | branches: [ "main" ] 10 | 11 | jobs: 12 | build: 13 | 14 | runs-on: self-hosted 15 | 16 | steps: 17 | - name: Login to Docker Hub 18 | uses: docker/login-action@v3 19 | with: 20 | username: ${{ secrets.DOCKERHUB_USERNAME }} 21 | password: ${{ secrets.DOCKERHUB_TOKEN }} 22 | 23 | - name: Push Docker Image 24 | run: | 25 | docker pull adijaiswal/devtaskmaster:latest 26 | docker tag adijaiswal/devtaskmaster:latest adijaiswal/prodtaskmaster:latest 27 | docker push adijaiswal/prodtaskmaster:latest 28 | - name: Kubectl Action 29 | uses: tale/kubectl-action@v1 30 | with: 31 | base64-kube-config: ${{ secrets.KUBE_CONFIG_PROD }} 32 | - run: | 33 | kubectl apply -f deployment-service.yml 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amazoncorretto:17.0.8-alpine3.18 2 | 3 | EXPOSE 8080 4 | 5 | ENV APP_HOME /usr/src/app 6 | 7 | COPY target/*.jar $APP_HOME/app.jar 8 | 9 | WORKDIR $APP_HOME 10 | 11 | CMD ["java", "-jar", "app.jar"] 12 | -------------------------------------------------------------------------------- /RBAC.md: -------------------------------------------------------------------------------- 1 | 2 | ### **Updated Steps for Service Account and Role Creation** 3 | 4 | 1. **Create the Service Account**: 5 | Define a service account for Jenkins in the `webapps` namespace: 6 | ```yaml 7 | apiVersion: v1 8 | kind: ServiceAccount 9 | metadata: 10 | name: jenkins 11 | namespace: webapps 12 | ``` 13 | 14 | 15 | 2. **Create Role for Namespace-Scoped Permissions**: 16 | Define a `Role` for namespace-specific resources (e.g., PVCs, Deployments): 17 | ```yaml 18 | apiVersion: rbac.authorization.k8s.io/v1 19 | kind: Role 20 | metadata: 21 | name: app-role 22 | namespace: webapps 23 | rules: 24 | - apiGroups: 25 | - "" 26 | resources: 27 | - pods 28 | - configmaps 29 | - secrets 30 | - services 31 | - persistentvolumeclaims 32 | verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 33 | - apiGroups: 34 | - apps 35 | resources: 36 | - deployments 37 | - replicasets 38 | verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 39 | ``` 40 | 41 | 3. **Bind the Role to the Service Account**: 42 | Attach the `Role` to the `jenkins` service account: 43 | ```yaml 44 | apiVersion: rbac.authorization.k8s.io/v1 45 | kind: RoleBinding 46 | metadata: 47 | name: app-rolebinding 48 | namespace: webapps 49 | roleRef: 50 | apiGroup: rbac.authorization.k8s.io 51 | kind: Role 52 | name: app-role 53 | subjects: 54 | - kind: ServiceAccount 55 | name: jenkins 56 | namespace: webapps 57 | ``` 58 | 59 | 4. **Create ClusterRole for Cluster-Scoped Resources**: 60 | Add a `ClusterRole` for cluster-scoped resources like PVs and StorageClasses: 61 | ```yaml 62 | apiVersion: rbac.authorization.k8s.io/v1 63 | kind: ClusterRole 64 | metadata: 65 | name: jenkins-cluster-role 66 | rules: 67 | - apiGroups: [""] 68 | resources: 69 | - persistentvolumes 70 | verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 71 | - apiGroups: ["storage.k8s.io"] 72 | resources: 73 | - storageclasses 74 | verbs: ["get", "list", "watch"] 75 | ``` 76 | 77 | 5. **Bind the ClusterRole to the Service Account**: 78 | Create a `ClusterRoleBinding` to attach the `ClusterRole` to the `jenkins` service account: 79 | ```yaml 80 | apiVersion: rbac.authorization.k8s.io/v1 81 | kind: ClusterRoleBinding 82 | metadata: 83 | name: jenkins-cluster-role-binding 84 | roleRef: 85 | apiGroup: rbac.authorization.k8s.io 86 | kind: ClusterRole 87 | name: jenkins-cluster-role 88 | subjects: 89 | - kind: ServiceAccount 90 | name: jenkins 91 | namespace: webapps 92 | ``` 93 | 94 | 95 | ### Generate token using service account in the namespace 96 | [Create Token](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#:~:text=To%20create%20a%20non%2Dexpiring,with%20that%20generated%20token%20data.) 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Task Master Pro 2 | 3 | Welcome to Task Master Pro, a comprehensive Java application designed to manage tasks efficiently. This project is developed and maintained by DevOps Shack, a YouTube channel dedicated to DevOps tutorials and best practices. 4 | 5 | ## Table of Contents 6 | - [Introduction](#introduction) 7 | - [Features](#features) 8 | - [Installation](#installation) 9 | - [Usage](#usage) 10 | - [Contributing](#contributing) 11 | - [License](#license) 12 | - [Contact](#contact) 13 | 14 | ## Introduction 15 | 16 | Task Master Pro is a task management application built using Java. It provides a robust set of features to help users create, manage, and track tasks. This project aims to demonstrate best practices in Java development, including project structure, coding standards, and documentation. 17 | 18 | ## Features 19 | 20 | - Create, update, and delete tasks 21 | - Mark tasks as complete or incomplete 22 | - User authentication and authorization 23 | 24 | ## Installation 25 | 26 | ### Prerequisites 27 | 28 | - Java Development Kit (JDK) 17 or later 29 | - Apache Maven 3.6.0 or later 30 | - A database (H2) 31 | 32 | ### Steps 33 | 34 | 1. Clone the repository: 35 | 36 | ```sh 37 | git clone https://github.com/jaiswaladi246/Task-Master-Pro.git 38 | cd Task-Master-Pro 39 | ``` 40 | 41 | 2. Configure the database: 42 | 43 | Update the `application.properties` file with your database configuration. 44 | 45 | 3. Build the project: 46 | 47 | ```sh 48 | mvn clean install 49 | ``` 50 | 51 | 4. Run the application: 52 | 53 | ```sh 54 | mvn spring-boot:run 55 | ``` 56 | 57 | ## Usage 58 | 59 | Once the application is running, you can access it at `http://localhost:8080`. You can use the web interface to manage your tasks. 60 | 61 | ### Endpoints 62 | 63 | - `/tasks` - View and manage tasks 64 | - `/tasks/{id}` - View, update, or delete a specific task 65 | - `/login` - User login 66 | - `/register` - User registration 67 | 68 | ## Contributing 69 | 70 | We welcome contributions to improve Task Master Pro. If you have a feature request, bug report, or improvement suggestion, please open an issue or submit a pull request. 71 | 72 | ### Steps to Contribute 73 | 74 | 1. Fork the repository 75 | 2. Create a new branch (`git checkout -b feature-branch`) 76 | 3. Make your changes 77 | 4. Commit your changes (`git commit -m 'Add some feature'`) 78 | 5. Push to the branch (`git push origin feature-branch`) 79 | 6. Open a pull request 80 | 81 | ## License 82 | 83 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. 84 | 85 | ## Contact 86 | 87 | For any questions or inquiries, please reach out to us at [DevOps Shack](https://www.youtube.com/@devopsshack/videos) 88 | 89 | Happy coding! 90 | -------------------------------------------------------------------------------- /deployment-service.yml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment # Kubernetes resource kind we are creating 3 | metadata: 4 | name: taskmaster-deployment 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: taskmaster 9 | replicas: 2 # Number of replicas that will be created for this deployment 10 | template: 11 | metadata: 12 | labels: 13 | app: taskmaster 14 | spec: 15 | containers: 16 | - name: taskmaster 17 | image: adijaiswal/prodtaskmaster:latest # Image that will be used to containers in the cluster 18 | imagePullPolicy: Always 19 | ports: 20 | - containerPort: 8080 # The port that the container is running on in the cluster 21 | 22 | 23 | --- 24 | 25 | apiVersion: v1 # Kubernetes API version 26 | kind: Service # Kubernetes resource kind we are creating 27 | metadata: # Metadata of the resource kind we are creating 28 | name: taskmaster-ssvc 29 | spec: 30 | selector: 31 | app: taskmaster 32 | ports: 33 | - protocol: "TCP" 34 | port: 80 35 | targetPort: 8080 36 | type: LoadBalancer # type of the service. 37 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | com.example.todo 5 | todo-app 6 | jar 7 | 1.0-SNAPSHOT 8 | todo-app 9 | http://maven.apache.org 10 | 11 | 11 12 | 2.5.4 13 | 5.7.0 14 | 15 | 16 | 17 | org.springframework.boot 18 | spring-boot-starter-web 19 | ${spring.boot.version} 20 | 21 | 22 | org.springframework.boot 23 | spring-boot-starter-thymeleaf 24 | ${spring.boot.version} 25 | 26 | 27 | org.springframework.boot 28 | spring-boot-starter-data-jpa 29 | ${spring.boot.version} 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-security 34 | ${spring.boot.version} 35 | 36 | 37 | com.h2database 38 | h2 39 | 1.4.200 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-starter-test 44 | ${spring.boot.version} 45 | test 46 | 47 | 48 | org.junit.vintage 49 | junit-vintage-engine 50 | 51 | 52 | 53 | 54 | org.junit.jupiter 55 | junit-jupiter-api 56 | ${junit.jupiter.version} 57 | test 58 | 59 | 60 | org.junit.jupiter 61 | junit-jupiter-engine 62 | ${junit.jupiter.version} 63 | test 64 | 65 | 66 | 67 | javax.xml.bind 68 | jaxb-api 69 | 2.3.1 70 | 71 | 72 | org.glassfish.jaxb 73 | jaxb-runtime 74 | 2.3.1 75 | 76 | 77 | 78 | 79 | 80 | org.springframework.boot 81 | spring-boot-maven-plugin 82 | ${spring.boot.version} 83 | 84 | 85 | 86 | repackage 87 | 88 | 89 | 90 | 91 | 92 | org.apache.maven.plugins 93 | maven-compiler-plugin 94 | 3.8.1 95 | 96 | ${java.version} 97 | ${java.version} 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | maven-releases 106 | http://13.126.119.93:8081/repository/maven-releases/ 107 | 108 | 109 | maven-snapshots 110 | http://13.126.119.93:8081/repository/maven-snapshots/ 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.projectKey=TaskMaster 2 | sonar.projectName=TaskMaster 3 | sonar.java.binaries=. 4 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/App.java: -------------------------------------------------------------------------------- 1 | package com.example.todo; 2 | 3 | /** 4 | * Hello world! 5 | * 6 | */ 7 | public class App 8 | { 9 | public static void main( String[] args ) 10 | { 11 | System.out.println( "Hello World!" ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/TaskMasterProApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.todo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TaskMasterProApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(TaskMasterProApplication.class, args); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/config/SecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.config; 2 | 3 | import com.example.todo.service.UserDetailsServiceImpl; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 8 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 9 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 10 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 11 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 12 | import org.springframework.security.crypto.password.PasswordEncoder; 13 | import org.springframework.security.web.SecurityFilterChain; 14 | 15 | @Configuration 16 | @EnableWebSecurity 17 | public class SecurityConfig { 18 | 19 | @Autowired 20 | private UserDetailsServiceImpl userDetailsService; 21 | 22 | @Bean 23 | public PasswordEncoder passwordEncoder() { 24 | return new BCryptPasswordEncoder(); 25 | } 26 | 27 | @Bean 28 | public DaoAuthenticationProvider authenticationProvider() { 29 | DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); 30 | authProvider.setUserDetailsService(userDetailsService); 31 | authProvider.setPasswordEncoder(passwordEncoder()); 32 | return authProvider; 33 | } 34 | 35 | @Autowired 36 | protected void configure(AuthenticationManagerBuilder auth) { 37 | auth.authenticationProvider(authenticationProvider()); 38 | } 39 | 40 | @Bean 41 | public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { 42 | http 43 | .authorizeRequests() 44 | .antMatchers("/signup", "/h2-console/**").permitAll() 45 | .anyRequest().authenticated() 46 | .and() 47 | .formLogin() 48 | .loginPage("/login") 49 | .permitAll() 50 | .and() 51 | .logout() 52 | .permitAll(); 53 | 54 | http.csrf().disable(); 55 | http.headers().frameOptions().disable(); 56 | 57 | return http.build(); 58 | } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/controller/TodoController.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.controller; 2 | 3 | import com.example.todo.model.Todo; 4 | import com.example.todo.repository.TodoRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.core.Authentication; 7 | import org.springframework.security.core.userdetails.UserDetails; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.ui.Model; 10 | import org.springframework.web.bind.annotation.*; 11 | 12 | import java.util.List; 13 | 14 | @Controller 15 | public class TodoController { 16 | 17 | @Autowired 18 | private TodoRepository todoRepository; 19 | 20 | @GetMapping("/") 21 | public String home(Model model, Authentication authentication) { 22 | String username = ((UserDetails) authentication.getPrincipal()).getUsername(); 23 | List todos = todoRepository.findByUsername(username); 24 | model.addAttribute("todos", todos); 25 | return "index"; 26 | } 27 | 28 | @PostMapping("/add") 29 | public String addTodo(@RequestParam String task, Authentication authentication) { 30 | String username = ((UserDetails) authentication.getPrincipal()).getUsername(); 31 | Todo todo = new Todo(); 32 | todo.setTask(task); 33 | todo.setUsername(username); 34 | todoRepository.save(todo); 35 | return "redirect:/"; 36 | } 37 | 38 | @PostMapping("/complete") 39 | public String completeTodo(@RequestParam Long id) { 40 | Todo todo = todoRepository.findById(id).orElseThrow(); 41 | todo.setCompleted(true); 42 | todoRepository.save(todo); 43 | return "redirect:/"; 44 | } 45 | 46 | @PostMapping("/delete") 47 | public String deleteTodo(@RequestParam Long id) { 48 | todoRepository.deleteById(id); 49 | return "redirect:/"; 50 | } 51 | 52 | @PostMapping("/update") 53 | public String updateTodo(@RequestParam Long id, @RequestParam String task) { 54 | Todo todo = todoRepository.findById(id).orElseThrow(); 55 | todo.setTask(task); 56 | todoRepository.save(todo); 57 | return "redirect:/"; 58 | } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.controller; 2 | 3 | import com.example.todo.model.User; 4 | import com.example.todo.repository.UserRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.crypto.password.PasswordEncoder; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.ui.Model; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.ModelAttribute; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | 13 | @Controller 14 | public class UserController { 15 | 16 | @Autowired 17 | private UserRepository userRepository; 18 | 19 | @Autowired 20 | private PasswordEncoder passwordEncoder; 21 | 22 | @GetMapping("/signup") 23 | public String signupForm(Model model) { 24 | model.addAttribute("user", new User()); 25 | return "signup"; 26 | } 27 | 28 | @PostMapping("/signup") 29 | public String signupSubmit(@ModelAttribute User user) { 30 | user.setPassword(passwordEncoder.encode(user.getPassword())); 31 | user.setRole("USER"); 32 | userRepository.save(user); 33 | return "redirect:/login"; 34 | } 35 | 36 | @GetMapping("/login") 37 | public String login() { 38 | return "login"; 39 | } 40 | 41 | @GetMapping("/logout") 42 | public String logout() { 43 | return "redirect:/login?logout"; 44 | } 45 | } 46 | 47 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/model/Todo.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.model; 2 | 3 | import javax.persistence.*; 4 | 5 | @Entity 6 | public class Todo { 7 | 8 | @Id 9 | @GeneratedValue(strategy = GenerationType.IDENTITY) 10 | private Long id; 11 | private String task; 12 | private String username; 13 | private boolean completed; 14 | 15 | // Getters and Setters 16 | public Long getId() { 17 | return id; 18 | } 19 | 20 | public void setId(Long id) { 21 | this.id = id; 22 | } 23 | 24 | public String getTask() { 25 | return task; 26 | } 27 | 28 | public void setTask(String task) { 29 | this.task = task; 30 | } 31 | 32 | public String getUsername() { 33 | return username; 34 | } 35 | 36 | public void setUsername(String username) { 37 | this.username = username; 38 | } 39 | 40 | public boolean isCompleted() { 41 | return completed; 42 | } 43 | 44 | public void setCompleted(boolean completed) { 45 | this.completed = completed; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/model/User.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.model; 2 | 3 | import javax.persistence.*; 4 | 5 | @Entity 6 | public class User { 7 | @Id 8 | @GeneratedValue(strategy = GenerationType.IDENTITY) 9 | private Long id; 10 | private String username; 11 | private String password; 12 | private String role; 13 | 14 | // Getters and setters 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getUsername() { 24 | return username; 25 | } 26 | 27 | public void setUsername(String username) { 28 | this.username = username; 29 | } 30 | 31 | public String getPassword() { 32 | return password; 33 | } 34 | 35 | public void setPassword(String password) { 36 | this.password = password; 37 | } 38 | 39 | public String getRole() { 40 | return role; 41 | } 42 | 43 | public void setRole(String role) { 44 | this.role = role; 45 | } 46 | } 47 | 48 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/repository/TodoRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.repository; 2 | 3 | import com.example.todo.model.Todo; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | 8 | public interface TodoRepository extends JpaRepository { 9 | List findByUsername(String username); 10 | } 11 | 12 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.repository; 2 | 3 | import com.example.todo.model.User; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface UserRepository extends JpaRepository { 7 | User findByUsername(String username); 8 | } 9 | 10 | -------------------------------------------------------------------------------- /src/main/java/com/example/todo/service/UserDetailsServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.example.todo.service; 2 | 3 | import com.example.todo.model.User; 4 | import com.example.todo.repository.UserRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.core.userdetails.UserDetails; 7 | import org.springframework.security.core.userdetails.UserDetailsService; 8 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 9 | import org.springframework.security.core.userdetails.User.UserBuilder; 10 | import org.springframework.stereotype.Service; 11 | 12 | @Service 13 | public class UserDetailsServiceImpl implements UserDetailsService { 14 | 15 | @Autowired 16 | private UserRepository userRepository; 17 | 18 | @Override 19 | public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 20 | User user = userRepository.findByUsername(username); 21 | if (user == null) { 22 | throw new UsernameNotFoundException("User not found."); 23 | } 24 | UserBuilder builder = org.springframework.security.core.userdetails.User.withUsername(username); 25 | builder.password(user.getPassword()); 26 | builder.roles(user.getRole()); 27 | return builder.build(); 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.h2.console.enabled=true 2 | spring.datasource.url=jdbc:h2:mem:testdb 3 | spring.datasource.driverClassName=org.h2.Driver 4 | spring.datasource.username=sa 5 | spring.datasource.password=password 6 | spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 7 | spring.jpa.hibernate.ddl-auto=update 8 | spring.thymeleaf.cache=false 9 | 10 | # Spring Security 11 | spring.security.user.name=admin 12 | spring.security.user.password=admin 13 | 14 | -------------------------------------------------------------------------------- /src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | TaskMaster Pro 8 | 9 | 10 | 276 | 277 | 278 | 279 | 280 | TaskMaster Pro by DevOps Shack 281 | 282 | 283 | 284 | 285 | 286 | 287 | Home 288 | 289 | 290 | Demo 291 | 292 | 293 | Contact 294 | 295 | 296 | Logout 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | Master Your Tasks with TaskMaster Pro 316 | Streamline your productivity and achieve more every day 317 | Try It Now 318 | 319 | 320 | 321 | 322 | 323 | 324 | Start Managing Tasks 325 | 326 | 327 | 328 | Add 329 | 330 | 331 | 332 | 333 | Total tasks: 0 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | Get Started with TaskMaster Pro 342 | Join thousands of users who have transformed their productivity. 343 | Sign Up Now 344 | 345 | 346 | 347 | 348 | 359 | 360 | 361 | 362 | 363 | 407 | 408 | 409 | 410 | 411 | -------------------------------------------------------------------------------- /src/main/resources/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Login - TaskMaster Pro 8 | 9 | 10 | 64 | 65 | 66 | 67 | 68 | TaskMaster Pro by DevOps Shack 69 | 70 | 71 | 72 | Login 73 | 74 | 75 | Username 76 | 77 | 78 | 79 | Password 80 | 81 | 82 | Login 83 | 84 | Don't have an account? Sign up here 85 | 86 | 87 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /src/main/resources/templates/signup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sign Up - TaskMaster Pro 8 | 9 | 10 | 64 | 65 | 66 | 67 | 68 | TaskMaster Pro by DevOps Shack 69 | 70 | 71 | 72 | Sign Up 73 | 74 | 75 | Username 76 | 77 | 78 | 79 | Password 80 | 81 | 82 | Sign Up 83 | 84 | Already have an account? Login here 85 | 86 | 87 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /src/test/java/com/example/todo/AppTest.java: -------------------------------------------------------------------------------- 1 | package com.example.todo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | import static org.junit.jupiter.api.Assertions.assertTrue; 7 | 8 | @SpringBootTest 9 | class TodoApplicationTests { 10 | 11 | @Test 12 | void contextLoads() { 13 | assertTrue(true); 14 | } 15 | } 16 | 17 | --------------------------------------------------------------------------------
Streamline your productivity and achieve more every day
Join thousands of users who have transformed their productivity.
Don't have an account? Sign up here
Already have an account? Login here