Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,8 @@ public interface FolderRepository extends JpaRepository<Folder, Integer>{
""")
Optional<Folder> findByIdAndMemberId(@Param("folderId") Integer folderId,
@Param("memberId") Integer memberId);

Optional<Folder> findByArchiveIdAndName(Integer archiveId, String name);

List<Folder> findAllByArchiveId(Integer archiveId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.tuna.zoopzoop.backend.domain.auth.dev.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import org.tuna.zoopzoop.backend.domain.member.entity.Member;
import org.tuna.zoopzoop.backend.domain.member.enums.Provider;
import org.tuna.zoopzoop.backend.domain.member.repository.MemberRepository;
import org.tuna.zoopzoop.backend.global.security.jwt.JwtUtil;

import java.util.Map;

@Profile({"local","dev","staging","test"})
@RestController
@RequestMapping("/dev")
@RequiredArgsConstructor
public class DevController {

private final MemberRepository memberRepository;
private final JwtUtil jwtUtil;

@GetMapping("/token")
public Map<String, String> issueToken(
@RequestParam Provider provider,
@RequestParam String key
) {
Member m = memberRepository.findByProviderAndProviderKey(provider, key)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "member not found"));

String accessToken = jwtUtil.generateToken(m);
return Map.of("accessToken", accessToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,7 @@ public interface DataSourceRepository extends JpaRepository<DataSource, Integer>
""")
List<Integer> findExistingIdsInMember(@Param("memberId") Integer memberId, @Param("ids") Collection<Integer> ids);

Optional<DataSource> findByFolderIdAndTitle(Integer folderId, String title);

}

Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ public class Node extends BaseEntity {

@ElementCollection
@CollectionTable(name = "node_data", joinColumns = @JoinColumn(name = "node_id"))
@MapKeyColumn(name = "key")
@Column(name = "value")
@MapKeyColumn(name = "data_key")
@Column(name = "data_value")
private Map<String, String> data = new HashMap<>();

@Column
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package org.tuna.zoopzoop.backend.global.initData;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import org.tuna.zoopzoop.backend.domain.archive.archive.entity.PersonalArchive;
import org.tuna.zoopzoop.backend.domain.archive.folder.entity.Folder;
import org.tuna.zoopzoop.backend.domain.archive.folder.repository.FolderRepository;
import org.tuna.zoopzoop.backend.domain.datasource.entity.Category;
import org.tuna.zoopzoop.backend.domain.datasource.entity.DataSource;
import org.tuna.zoopzoop.backend.domain.datasource.repository.DataSourceRepository;
import org.tuna.zoopzoop.backend.domain.member.entity.Member;
import org.tuna.zoopzoop.backend.domain.member.enums.Provider;
import org.tuna.zoopzoop.backend.domain.member.repository.MemberRepository;

import java.time.LocalDate;
import java.util.List;

@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(value = "app.seed.enabled", havingValue = "true")
public class PersonalArchiveInitData {

private final MemberRepository memberRepository;
private final FolderRepository folderRepository;
private final DataSourceRepository dataSourceRepository;

@Autowired @Lazy
private PersonalArchiveInitData self;

@Bean
ApplicationRunner archiveInitRunner() {
return args -> self.initAll(); // 프록시 경유
}

@Transactional
public void initAll() {
System.out.println(">>> seed initAll start");

final String providerKeyEmail = "[email protected]";

Member member = memberRepository
.findByProviderAndProviderKey(Provider.KAKAO, providerKeyEmail)
.orElseGet(() -> memberRepository.save(
Member.builder()
.name("kjjeaus")
.providerKey(providerKeyEmail)
.provider(Provider.KAKAO)
.profileImageUrl("https://img.example.com/profile.png")
.build()
));

PersonalArchive pa = member.getPersonalArchive();

folderRepository.findByArchiveIdAndName(pa.getArchive().getId(), "default")
.orElseGet(() -> {
Folder df = pa.getArchive().getFolders().stream()
.filter(Folder::isDefault)
.findFirst()
.orElse(new Folder("default"));
df.setArchive(pa.getArchive());
df.setDefault(true);
return folderRepository.save(df);
});

for (String name : List.of("inbox","research","ai","reading-list")) {
folderRepository.findByArchiveIdAndName(pa.getArchive().getId(), name)
.orElseGet(() -> {
Folder f = new Folder(name);
f.setDefault(false);
f.setArchive(pa.getArchive());
return folderRepository.save(f);
});
}

List<Folder> persistedFolders = folderRepository.findAllByArchiveId(pa.getArchive().getId());

for (Folder folder : persistedFolders) {
for (int i = 1; i <= 3; i++) {
String title = folder.getName() + "-자료" + i;
if (dataSourceRepository.findByFolderIdAndTitle(folder.getId(), title).isPresent()) continue;

DataSource ds = new DataSource();
ds.setFolder(folder);
ds.setTitle(title);
ds.setSummary("초기 목데이터");
ds.setDataCreatedDate(LocalDate.now().minusDays(i));
ds.setSourceUrl("https://example.com/" + folder.getName() + "/" + i);
ds.setImageUrl("https://example.com/img/" + i + ".png");
ds.setSource("Seed");
ds.setCategory(Category.IT);
ds.setActive(true);

dataSourceRepository.save(ds);
}
}

System.out.println(">>> seed initAll end");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
"/webjars/**",
"/api/v1/**", // API 테스트용으로 모두 허용. 차후 필수로 변경 필요.
"/test/**", // 테스트용으로 모두 허용. 차후 삭제 필요.
"/actuator/health" // health 체크용
"/actuator/health", // health 체크용
"/dev/**" // ← 추가: dev 토큰 발급은 누구나 접근
).permitAll()
.anyRequest().authenticated()
)
Expand Down
7 changes: 6 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,9 @@ logging:
org.springframework.transaction.interceptor: TRACE
com.back: DEBUG
server:
port: 8080
port: 8080


app:
seed:
enabled: true
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public class MemberControllerTest {

@BeforeAll
void setUp() {
memberRepository.deleteAll();
Member member1 = memberService.createMember(
"test1",
"url",
Expand Down