Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
bce7dbc
feat : ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์ฒดํฌ (nickname unique), ์ธ์ฆ์ฝ”๋“œ ๊ฒ€์‚ฌ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
yyytir777 Dec 8, 2025
3573613
fix : user_id IDENTITY strategy & dev redis host ์ด๋ฆ„๋ณ€๊ฒฝ (localhost -> rโ€ฆ
yyytir777 Dec 8, 2025
08cfb63
test์ฝ”๋“œ ์ƒ์„ฑ & swagger url ์‚ญ์ œ & ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ค‘๋ณต ์‚ญ์ œ
yyytir777 Dec 8, 2025
ac96fa0
fix : ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€
yyytir777 Dec 9, 2025
43e75ed
Merge pull request #27 from tinybite-2025/feature/13-user
yyytir777 Dec 9, 2025
a70941b
Feature/26 notification (#29)
marshmallowing Dec 11, 2025
cbbf597
feat : google login ๊ตฌํ˜„ ์™„๋ฃŒ
yyytir777 Dec 11, 2025
d03fd30
fix : main push ์‹œ์—๋งŒ workflow trigger
yyytir777 Dec 11, 2025
00cc289
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
yyytir777 Dec 11, 2025
729ae0a
Feature/#28 google apple login
yyytir777 Dec 16, 2025
b5c29db
Merge branch 'main' into develop
yyytir777 Dec 16, 2025
2e5da55
Merge branch 'develop' of https://github.com/tinybite-2025/tinybite-sโ€ฆ
yyytir777 Dec 18, 2025
1fbd896
merge main into develop : main์˜ ํ•ซํ”ฝ์Šค ๋ณ€๊ฒฝ์‚ฌํ•ญ develop์— ๋ฐ˜์˜
yyytir777 Dec 18, 2025
dd9771a
workflow ์ค„๋ฐ”๊ฟˆ ์—๋Ÿฌ ์ˆ˜์ •
yyytir777 Dec 18, 2025
38de611
hotifx : ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ˆ˜์ • ๋ฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์‚ญ์ œ (๋ฆฌ์†Œ์Šค ๋„ˆ๋ฌด ๋งŽ์ด ๋จน์Œ)
yyytir777 Dec 19, 2025
91b8cba
main์˜ ํ•ซํ”ฝ์Šค develop์— ๋ฐ˜์˜
yyytir777 Dec 22, 2025
fbc5e90
์ˆ˜์ •์‚ฌํ•ญ ๋ฐ˜์˜ (API ์ธ์ฆ ๊ด€๋ จ, db schema, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ..)
yyytir777 Dec 23, 2025
7b9fb7b
main๋ธŒ๋žœ์น˜ ํ•ซํ”ฝ์Šค ๋ฐ˜์˜
yyytir777 Dec 24, 2025
bbb080f
Feature/35 term (#38)
yyytir777 Dec 24, 2025
4c352aa
fix : docker compose ๋ช…๋ น์–ด ์ˆ˜์ •
yyytir777 Dec 24, 2025
27dfcbb
Feature : ํŒŒํ‹ฐ ๊ธฐ๋Šฅ (#42)
milowon Dec 27, 2025
0de3a43
Merge branch 'main' into develop
milowon Dec 31, 2025
2f27dee
hotfix : url parser ๊ฒฝ๋กœ ์ œ๊ฑฐ
milowon Dec 31, 2025
6eb0d8d
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 1, 2026
3f69bc1
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 2, 2026
45191a9
hotfix : ํŒŒํ‹ฐ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋กœ์ง ์ž„์‹œ ์ฃผ์„ ์ฒ˜๋ฆฌ
milowon Jan 2, 2026
3a9a6e6
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 2, 2026
b2ca1f4
hotfix : ํŒŒํ‹ฐ ์ˆ˜์ •, ์‚ญ์ œ controller ์ถ”๊ฐ€
milowon Jan 2, 2026
38ab16c
hotfix : ์„ ํƒ ๊ฐ’๋“ค์ด ์กด์žฌํ• ๋•Œ๋งŒ ๋„ฃ๋„๋ก ์ˆ˜์ •
milowon Jan 2, 2026
037d2e4
hotfix : ์œ„๋„, ๊ฒฝ๋„ ๋กœ์ง ์‚ญ์ œ
milowon Jan 2, 2026
9d305f8
Feat : ๋งˆ์ดํŽ˜์ด์ง€ ์ฐธ์—ฌ์ค‘์ธ ํŒŒํ‹ฐ ์กฐํšŒ (#50)
milowon Jan 2, 2026
1cee657
hotfix : user service์— transactional ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
milowon Jan 2, 2026
5213214
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 2, 2026
ed3a399
hotfix : ์ฐธ์—ฌ์ค‘ ํŒŒํ‹ฐ ์กฐํšŒ ๋ฐ˜ํ™˜ ํ˜•์‹ ํ†ต์ผ
milowon Jan 2, 2026
374f720
hotfix : ํŒŒํ‹ฐ ์ƒ์„ฑ, ์กฐํšŒ ์‹œ, ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋กœ์ง ๋ฐ˜์˜
milowon Jan 2, 2026
4ddfa39
Hotfix: ์œ ์ € ์ขŒํ‘œ ์ž…๋ ฅ requestParam ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝ
milowon Jan 2, 2026
42bc4d4
Merge branch 'main' into develop
milowon Jan 2, 2026
9ee078a
Merge branch 'main' into develop
milowon Jan 2, 2026
3be9d38
hotfix : ๋ˆ„๋ฝ๋œ swagger ๋ฌธ์„œ ์ˆ˜์ •์‚ฌํ•ญ ๋ฐ˜์˜
milowon Jan 2, 2026
89bbef3
Merge branch 'main' into develop
milowon Jan 2, 2026
b281a29
feat : ํšŒ์› ํƒˆํ‡ด ๋ฐ ์žฌ๊ฐ€์ž… ๋ฐฉ์ง€, ๊ฒ€์ฆ (#65)
milowon Jan 2, 2026
35a62b7
fix : ํŒŒํ‹ฐ ์ˆ˜์ • ๋ฒ„๊ทธ ํ”ฝ์Šค (#67)
milowon Jan 2, 2026
a4f3582
hotfix : ํƒˆํ‡ด ์œ ์ € ๋งˆ์Šคํ‚น ๋กœ์ง ๋ณ€๊ฒฝ
milowon Jan 3, 2026
9f05a6a
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 3, 2026
d802e15
feat : ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ฐธ์—ฌ์ค‘,ํ˜ธ์ŠคํŠธ์ธ ํŒŒํ‹ฐ ๊ตฌ๋ถ„ํ•ด์„œ ์กฐํšŒ (#71)
milowon Jan 4, 2026
8715584
Feature/73 search party (#74)
yyytir777 Jan 4, 2026
78349d6
fix : ์Šค์›จ๊ฑฐ description ์ถ”๊ฐ€
yyytir777 Jan 4, 2026
ba3d9d8
Merge branch 'main' into develop
yyytir777 Jan 4, 2026
c15e45b
Feature/73 search party (#76)
yyytir777 Jan 4, 2026
92bef29
Merge branch 'main' into develop
yyytir777 Jan 4, 2026
bd136de
Fix : ํ˜ธ์ŠคํŠธ๋งŒ ์žˆ์„๋•Œ๋Š” ํŒŒํ‹ฐ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ (#78)
milowon Jan 4, 2026
5d3e13d
fix : ํŒŒํ‹ฐ ์‚ญ์ œ์‹œ ํ˜ธ์ŠคํŠธ๋Š” ํ˜„์žฌ์ธ์›์—์„œ ์ œ์™ธํ•˜๋„๋ก ์ˆ˜์ • (#80)
milowon Jan 4, 2026
1e5b600
hotfix : jpa ๋„ค์ด๋ฐ ๋ฐ ์ฟผ๋ฆฌ ์ˆ˜์ •
yyytir777 Jan 4, 2026
ba4ed25
hotfix : jpa ๋„ค์ด๋ฐ ๋ฐ ์ฟผ๋ฆฌ ์ˆ˜์ •
yyytir777 Jan 4, 2026
c2d9465
Merge branch 'main' into develop
yyytir777 Jan 4, 2026
0b783c7
feat : ํŒŒํ‹ฐ ์นดํ…Œ๊ณ ๋ฆฌ, ์ตœ์‹ ์ˆœ, ๊ฑฐ๋ฆฌ์ˆœ ์ •๋ ฌ (#83)
milowon Jan 4, 2026
4474664
Merge branch 'main' of https://github.com/tinybite-2025/tinybite-servโ€ฆ
milowon Jan 4, 2026
3353068
Feature/44 chat (#82)
yyytir777 Jan 6, 2026
6e2450c
hotfix : ํŒŒํ‹ฐ ์‚ญ์ œ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ์ˆ˜์ • (#86)
milowon Jan 6, 2026
b9630cf
hotfix : ํŒŒํ‹ฐ ์ˆ˜์ •์‚ฌํ•ญ์ด db์— ๋ฐ˜์˜ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ์ˆ˜์ •
milowon Jan 6, 2026
866bb84
feat : ์œ ์ € ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ˆ˜์ •, ์‚ญ์ œ (#89)
milowon Jan 6, 2026
e1fc441
Fix : ์œ ์ € ํ”„๋กœํ•„ ์ˆ˜์ •, ์‚ญ์ œ (#91)
milowon Jan 6, 2026
64449d4
Merge branch 'main' into develop
milowon Jan 6, 2026
85f9a6e
hotfix: ์œ ์ € ์ •๋ณด ์กฐํšŒ์‹œ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
milowon Jan 9, 2026
17485c9
Fix/party search (#94)
yyytir777 Jan 9, 2026
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 @@ -490,10 +490,13 @@ public APIResponse<PartyQueryListResponse> getParty(
schema = @Schema(allowableValues = {"ALL", "DELIVERY", "GROCERY", "HOUSEHOLD"})
)
@RequestParam(defaultValue = "ALL") PartyCategory category,
@RequestParam(required = false, name = "lat") Double userLat,
@RequestParam(required = false, name = "lon") Double userLon,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size
) {
return APIResponse.success(partySearchService.searchParty(q, category, page, size));

return APIResponse.success(partySearchService.searchParty(q, category, page, size, userLat, userLon));
}

@Operation(
Expand All @@ -511,7 +514,7 @@ public APIResponse<List<String>> getRecentLog() {
@Operation(
summary = "ํŠน์ • ์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด ์‚ญ์ œ",
description = """
์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด์—์„œ ํŠน์ • ๊ฒ€์ƒ‰์–ด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. <br>
์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด์—์„œ ํŠน์ • ๊ฒ€์ƒ‰์–ด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. <br>
์ด๋•Œ ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•œ Id๊ฐ’์€ ์—†๊ณ , ์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด ์ž์ฒด๋ฅผ keyword์— ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
"""
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package ita.tinybite.domain.party.repository;

import io.lettuce.core.dynamic.annotation.Param;
import ita.tinybite.domain.chat.enums.ChatRoomType;
import ita.tinybite.domain.party.entity.Party;
import ita.tinybite.domain.party.enums.PartyCategory;
import java.util.List;
import java.util.Optional;

import ita.tinybite.domain.party.enums.PartyStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
Expand All @@ -25,8 +22,4 @@ public interface PartyRepository extends JpaRepository<Party, Long> {
List<Party> findByPickupLocation_PlaceAndCategory(String place, PartyCategory category);

List<Party> findByHostUserIdAndStatus(Long userId, PartyStatus partyStatus);

Page<Party> findByTitleContaining(String title, Pageable pageable);

Page<Party> findByTitleContainingAndCategory(String title, PartyCategory category, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package ita.tinybite.domain.party.repository;

import ita.tinybite.domain.party.entity.Party;
import ita.tinybite.domain.party.enums.PartyCategory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface PartySearchRepository extends JpaRepository<Party, Long> {

Page<Party> findByTitleContaining(String title, Pageable pageable);

Page<Party> findByTitleContainingAndCategory(String title, PartyCategory category, Pageable pageable);

@Query(value = """
SELECT p.*
FROM party p
WHERE p.title LIKE CONCAT('%', :title, '%')
ORDER BY (6371000 * acos(
cos(radians(:lat)) * cos(radians(p.pickup_latitude))
* cos(radians(p.pickup_longitude) - radians(:lon))
+ sin(radians(:lat)) * sin(radians(p.pickup_latitude))))
""", countQuery = """
SELECT COUNT(*)
FROM party p
WHERE p.title LIKE CONCAT('%', :title, '%')
""", nativeQuery = true)
Page<Party> findByTitleContainingWithDistance(String title, @Param("lat") Double lat, @Param("lon") Double lon, Pageable pageable);

@Query(value = """
SELECT p.*
FROM party p
WHERE p.
ORDER BY (6371000 * acos(
cos(radians(:lat)) * cos(radians(p.pickup_latitude))
* cos(radians(p.pickup_longitude) - radians(:lon))
+ sin(radians(:lat)) * sin(radians(p.pickup_latitude))))
""", countQuery = """
SELECT COUNT(*)
FROM party p
WHERE p.title LIKE CONCAT('%', :title, '%')
""", nativeQuery = true)
Page<Party> findByTitleContainingAndCategoryWithDistance(String q, Double lat, Double lon, PartyCategory category, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import ita.tinybite.domain.party.enums.ParticipantStatus;
import ita.tinybite.domain.party.enums.PartyCategory;
import ita.tinybite.domain.party.repository.PartyParticipantRepository;
import ita.tinybite.domain.party.repository.PartyRepository;
import ita.tinybite.domain.party.repository.PartySearchRepository;
import ita.tinybite.global.util.DistanceCalculator;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
Expand All @@ -23,7 +24,7 @@
@RequiredArgsConstructor
public class PartySearchService {

private final PartyRepository partyRepository;
private final PartySearchRepository partySearchRepository;
private final PartyParticipantRepository participantRepository;
private final StringRedisTemplate redisTemplate;
private final SecurityProvider securityProvider;
Expand All @@ -35,7 +36,7 @@ private String key(Long userId) {
}

// ํŒŒํ‹ฐ ๊ฒ€์ƒ‰ ์กฐํšŒ
public PartyQueryListResponse searchParty(String q, PartyCategory category, int page, int size) {
public PartyQueryListResponse searchParty(String q, PartyCategory category, int page, int size, Double lat, Double lon) {
Long userId = securityProvider.getCurrentUser().getUserId();

// recent_search:{userId}
Expand All @@ -45,24 +46,49 @@ public PartyQueryListResponse searchParty(String q, PartyCategory category, int
redisTemplate.opsForZSet().add(key, q, System.currentTimeMillis());

Pageable pageable = PageRequest.of(page, size);

// category๊ฐ€ ์—†์„ ์‹œ์—๋Š” ALL๋กœ ์ฒ˜๋ฆฌ
Page<Party> result = (category == null || category == PartyCategory.ALL)
? partyRepository.findByTitleContaining(q, pageable)
: partyRepository.findByTitleContainingAndCategory(q, category, pageable);

List<PartyCardResponse> partyCardResponseList = result.stream()
.map(party -> {
int currentParticipants = participantRepository
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
return PartyCardResponse.from(party, currentParticipants);
})
.toList();

return PartyQueryListResponse.builder()
.parties(partyCardResponseList)
.hasNext(result.hasNext())
.build();
List<PartyCardResponse> partyCardResponseList;

// ๊ฑฐ๋ฆฌ ์ •๋ณด X
if(lat == null || lon == null) {
// category๊ฐ€ ์—†์„ ์‹œ์—๋Š” ALL๋กœ ์ฒ˜๋ฆฌ
Page<Party> queryResults = (category == null || category == PartyCategory.ALL)
? partySearchRepository.findByTitleContaining(q, pageable)
: partySearchRepository.findByTitleContainingAndCategory(q, category, pageable);

partyCardResponseList = queryResults.stream()
.map(party -> {
int currentParticipants = participantRepository
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
return PartyCardResponse.from(party, currentParticipants);
})
.toList();

return PartyQueryListResponse.builder()
.parties(partyCardResponseList)
.hasNext(queryResults.hasNext())
.build();
} else {
// ๊ฑฐ๋ฆฌ ์ •๋ณด O (lat, lon)
Page<Party> queryResults = (category == null || category == PartyCategory.ALL)
? partySearchRepository.findByTitleContainingWithDistance(q, lat, lon, pageable)
: partySearchRepository.findByTitleContainingAndCategoryWithDistance(q, lat, lon, category, pageable);

partyCardResponseList = queryResults.stream()
.map(party -> {
int currentParticipants = participantRepository
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
PartyCardResponse res = PartyCardResponse.from(party, currentParticipants);
Double distance = DistanceCalculator.calculateDistance(lat, lon, party.getPickupLocation().getPickupLatitude(), party.getPickupLocation().getPickupLongitude());
res.addDistanceKm(distance);
return res;
})
.toList();

return PartyQueryListResponse.builder()
.parties(partyCardResponseList)
.hasNext(queryResults.hasNext())
.build();
}
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ public APIResponse<?> validateNickname(@RequestParam String nickname) {
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
})
@PutMapping("/profile-image")
@PatchMapping("/me/profile-image")
public ResponseEntity<Void> updateProfileImage(
@Parameter(description = "๋ณ€๊ฒฝํ•  ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ URL", required = true, example = "https://example.com/image.jpg")
@RequestParam("image") String image,
@RequestBody String image,
@Parameter(hidden = true)
@AuthenticationPrincipal Long userId) {

Expand Down Expand Up @@ -239,7 +239,7 @@ public ResponseEntity<Void> updateProfileImage(
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
})
@DeleteMapping("/profile-image")
@DeleteMapping("/me/profile-image")
public ResponseEntity<Void> deleteProfileImage(
@Parameter(hidden = true)
@AuthenticationPrincipal Long userId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
public record UserResDto(
Long userId,
String name,
String location
String location,
String userProfileImage
) {

public static UserResDto of(User user) {
return new UserResDto(user.getUserId(), user.getNickname(), user.getLocation());
return new UserResDto(user.getUserId(), user.getNickname(), user.getLocation(),user.getProfileImage());
}
}
2 changes: 1 addition & 1 deletion src/main/java/ita/tinybite/domain/user/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,6 @@ public void updateProfileImage(String image) {
}

public void deleteProfileImage() {
this.profileImage = "";
this.profileImage = null;
}
}