Skip to content

Commit

Permalink
enhancements(project): added project members and added refresh token
Browse files Browse the repository at this point in the history
  • Loading branch information
zZHorizonZz committed Jul 27, 2023
1 parent af5cfff commit 87cd261
Show file tree
Hide file tree
Showing 27 changed files with 395 additions and 276 deletions.
2 changes: 1 addition & 1 deletion dashboard/src/components/dev/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ props.
```

You can add some global initialization logic for the preview mode in `useInitital.ts`,
e.g. implicitly obtain user session:
e.g. implicitly obtain user refreshToken:

```typescript
export const useInitial: () => InitialHookStatus = () => {
Expand Down
22 changes: 4 additions & 18 deletions server/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,32 +75,18 @@
</dependency>

<!-- JWT: -->
<dependency>
<groupId>org.eclipse.microprofile.jwt</groupId>
<artifactId>microprofile-jwt-auth-api</artifactId>
<version>${microprofile-jwt-auth-api.version}</version>
</dependency>
<dependency>
<groupId>at.favre.lib</groupId>
<artifactId>bcrypt</artifactId>
<version>0.10.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt-build</artifactId>
</dependency>

<!-- Code generation: -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.shiperist.entity.account;

import io.quarkus.hibernate.reactive.panache.PanacheEntityBase;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.CreationTimestamp;

import java.util.Date;

@Data
@Entity(name = "RefreshToken")
@Table(name = "refresh_token", schema = "public")
@EqualsAndHashCode(callSuper = true)
public class RefreshTokenEntity extends PanacheEntityBase {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;

@Column(name = "token", unique = true, length = 1024)
private String token;

@Column(name = "user_id")
private Long userId;

@Column(name = "revoked")
private boolean revoked;

@CreationTimestamp
@Column(name = "created_at", updatable = false)
private Date createdAt;

@CreationTimestamp
@Column(name = "updated_at")
private Date updatedAt;

@ManyToOne
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private UserEntity user;

public RefreshTokenEntity() {
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,7 @@ public class UserEntity extends PanacheEntityBase {
private Set<AccountEntity> accounts;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private Set<SessionEntity> sessions;

@ManyToMany
@JoinTable(
name = "project_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "project_id")
)
private Set<ProjectEntity> projects;
private Set<RefreshTokenEntity> refreshTokens;

public UserEntity() {
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package dev.shiperist.entity.project;

import dev.shiperist.entity.account.UserEntity;
import io.quarkus.hibernate.reactive.panache.PanacheEntityBase;
import jakarta.persistence.*;
import lombok.Data;
Expand Down Expand Up @@ -38,6 +37,7 @@ public class ProjectEntity extends PanacheEntityBase {
@Column(name = "created_at", updatable = false)
private String createdAt;

@ManyToMany(mappedBy = "projects")
private Set<UserEntity> users;
@Column(name = "members")
@OneToMany(mappedBy = "project", fetch = FetchType.EAGER)
private Set<ProjectMemberEntity> members;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package dev.shiperist.entity.project;

import dev.shiperist.entity.account.UserEntity;
import io.quarkus.hibernate.reactive.panache.PanacheEntityBase;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@Entity(name = "ProjectMember")
@Table(name = "project_member", schema = "public")
@EqualsAndHashCode(callSuper = true)
public class ProjectMemberEntity extends PanacheEntityBase {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;

@Column(name = "user_id")
private Long userId;

@Column(name = "project_id")
private Long projectId;

@Column(name = "role")
private String role;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private UserEntity user;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "project_id", insertable = false, updatable = false)
private ProjectEntity project;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dev.shiperist.mapper.account;

import dev.shiperist.entity.account.RefreshTokenEntity;
import dev.shiperist.mapper.QuarkusMappingConfig;
import dev.shiperist.model.account.RefreshToken;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;

import java.util.List;

@Mapper(config = QuarkusMappingConfig.class)
public interface RefreshTokenMapper {

List<RefreshToken> toDomainList(List<RefreshTokenEntity> entities);

RefreshToken toDomain(RefreshTokenEntity entity);

@InheritInverseConfiguration(name = "toDomain")
RefreshTokenEntity toEntity(RefreshToken domain);

void updateEntityFromDomain(RefreshToken domain, @MappingTarget RefreshTokenEntity entity);

void updateDomainFromEntity(RefreshTokenEntity entity, @MappingTarget RefreshToken domain);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.shiperist.mapper.project;

import dev.shiperist.entity.project.ProjectMemberEntity;
import dev.shiperist.mapper.QuarkusMappingConfig;
import dev.shiperist.model.project.ProjectMember;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;

import java.util.List;

@Mapper(config = QuarkusMappingConfig.class)
public interface ProjectMemberMapper {
List<ProjectMember> toDomainList(List<ProjectMemberEntity> entities);

ProjectMember toDomain(ProjectMemberEntity entity);

@InheritInverseConfiguration(name = "toDomain")
ProjectMemberEntity toEntity(ProjectMember domain);

void updateEntityFromDomain(ProjectMember domain, @MappingTarget ProjectMemberEntity entity);

void updateDomainFromEntity(ProjectMemberEntity entity, @MappingTarget ProjectMember domain);
}
16 changes: 16 additions & 0 deletions server/src/main/java/dev/shiperist/model/account/RefreshToken.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dev.shiperist.model.account;

import lombok.Data;

import java.util.Date;

@Data
public class RefreshToken {
public Long id;
private String token;
private Long userId;
private Date expires;
private boolean revoked;
private Date createdAt;
private Date updatedAt;
}
15 changes: 0 additions & 15 deletions server/src/main/java/dev/shiperist/model/account/Session.java

This file was deleted.

4 changes: 2 additions & 2 deletions server/src/main/java/dev/shiperist/model/account/User.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.shiperist.model.account;

import dev.shiperist.entity.account.AccountEntity;
import dev.shiperist.entity.account.SessionEntity;
import dev.shiperist.entity.account.RefreshTokenEntity;
import lombok.Data;

import java.util.Date;
Expand All @@ -16,5 +16,5 @@ public class User {
private String image;
public String password;
private Set<AccountEntity> accounts;
private Set<SessionEntity> sessions;
private Set<RefreshTokenEntity> sessions;
}
11 changes: 11 additions & 0 deletions server/src/main/java/dev/shiperist/model/account/UserResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.shiperist.model.account;

import lombok.Data;

@Data
public class UserResponse {
private String accessToken;
private String tokenType;
private int expiresIn;
private String refreshToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.shiperist.model.project;

public class ProjectMember {
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package dev.shiperist.repository.account;

import dev.shiperist.entity.account.SessionEntity;
import dev.shiperist.entity.account.RefreshTokenEntity;
import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;

@WithSession
@ApplicationScoped
public class SessionRepository implements PanacheRepositoryBase<SessionEntity, Long> {
public class RefreshTokenRepository implements PanacheRepositoryBase<RefreshTokenEntity, Long> {

public Uni<SessionEntity> findByToken(String token) {
public Uni<RefreshTokenEntity> findByToken(String token) {
return find("sessionToken", token).firstResult();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.shiperist.repository.project;

import dev.shiperist.entity.project.ProjectMemberEntity;
import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import jakarta.enterprise.context.ApplicationScoped;

@WithSession
@ApplicationScoped
public class ProjectMemberRepository implements PanacheRepositoryBase<ProjectMemberEntity, Long> {
}
Loading

0 comments on commit 87cd261

Please sign in to comment.