Skip to content

Commit 04cd4c9

Browse files
authored
Fix PiCT reported bugs. (#14)
* Allow map vs button interactions in the homescreen and map center screen. * Added Findme feature and updated map_center settings (Backend). * Added Findme feature and updated map_center settings (Frontend). * Adjustments to search click behavior and zoom level for results.
1 parent da06af0 commit 04cd4c9

31 files changed

+529
-417
lines changed

backend/src/config/docs/MapCenterSchema.yml

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ components:
3939
example: 40.7128
4040
type:
4141
type: string
42+
enum:
43+
- search
44+
- sell
4245
example: search
4346

4447
SaveMapCenterRs:

backend/src/config/docs/UserPreferencesSchema.yml

+70-49
Original file line numberDiff line numberDiff line change
@@ -131,52 +131,73 @@ components:
131131
- user_settings_id
132132

133133
DeleteUserPreferencesRs:
134-
type: object
135-
properties:
136-
message:
137-
type: string
138-
example: User Preferences deleted successfully.
139-
deletedUserPreferences:
140-
type: object
141-
properties:
142-
user_settings_id:
143-
type: string
144-
example: 0d367ba3-a2e8-4380-86c3-ab7c0b7890c0
145-
user_name:
146-
type: string
147-
example: Test User
148-
email:
149-
type: string
150-
example: example@test.com
151-
phone_number:
152-
type: string
153-
example: +1 123 456 7890
154-
image:
155-
type: string
156-
format: binary
157-
example: http://example.com/image.jpg
158-
findme:
159-
$ref: '/api/docs/enum/DeviceLocationType.yml#/components/schemas/DeviceLocationType'
160-
trust_meter_rating:
161-
$ref: '/api/docs/enum/TrustMeterScale.yml#/components/schemas/TrustMeterScale'
162-
search_map_center:
163-
type: object
164-
properties:
165-
type:
166-
type: string
167-
example: Point
168-
coordinates:
169-
type: array
170-
items:
171-
type: number
172-
example: [-73.856077, 40.848447]
173-
required:
174-
- type
175-
- coordinates
176-
_id:
177-
type: string
178-
example: 666c84b9d77068c6efeeaa1a
179-
__v:
180-
type: number
181-
example: 0
182-
134+
type: object
135+
properties:
136+
message:
137+
type: string
138+
example: User Preferences deleted successfully.
139+
deletedUserPreferences:
140+
type: object
141+
properties:
142+
user_settings_id:
143+
type: string
144+
example: 0d367ba3-a2e8-4380-86c3-ab7c0b7890c0
145+
user_name:
146+
type: string
147+
example: Test User
148+
email:
149+
type: string
150+
example: example@test.com
151+
phone_number:
152+
type: string
153+
example: +1 123 456 7890
154+
image:
155+
type: string
156+
format: binary
157+
example: http://example.com/image.jpg
158+
findme:
159+
$ref: '/api/docs/enum/DeviceLocationType.yml#/components/schemas/DeviceLocationType'
160+
trust_meter_rating:
161+
$ref: '/api/docs/enum/TrustMeterScale.yml#/components/schemas/TrustMeterScale'
162+
search_map_center:
163+
type: object
164+
properties:
165+
type:
166+
type: string
167+
example: Point
168+
coordinates:
169+
type: array
170+
items:
171+
type: number
172+
example: [-73.856077, 40.848447]
173+
required:
174+
- type
175+
- coordinates
176+
_id:
177+
type: string
178+
example: 666c84b9d77068c6efeeaa1a
179+
__v:
180+
type: number
181+
example: 0
182+
183+
GetUserLocationRs:
184+
type: object
185+
properties:
186+
origin:
187+
type: object
188+
properties:
189+
lat:
190+
type: number
191+
example: -73.856077
192+
lng:
193+
type: number
194+
example: 40.848447
195+
required:
196+
- lat
197+
- lng
198+
radius:
199+
type: number
200+
example: 10
201+
required:
202+
- origin
203+
- radius

backend/src/config/docs/enum/DeviceLocationType.yml

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ components:
33
DeviceLocationType:
44
type: string
55
enum:
6+
- auto
67
- deviceGPS
78
- searchCenter
89
description: The type of FindMe device location.

backend/src/controllers/mapCenterController.ts

+3-23
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,7 @@ export const saveMapCenter = async (req: Request, res: Response) => {
2020
const mapCenter = await mapCenterService.createOrUpdateMapCenter(map_center_id, longitude, latitude, type);
2121
logger.info(`${type === 'search' ? 'Search' : 'Sell'} Center saved successfully for user ${map_center_id} with Longitude: ${longitude}, Latitude: ${latitude} `);
2222

23-
if (type === 'sell') {
24-
const sellMapCenter = {
25-
type: 'Point',
26-
coordinates: [longitude, latitude],
27-
};
28-
29-
// Update the seller's sell_map_center
30-
const updatedSeller = await Seller.findOneAndUpdate(
31-
{ seller_id: map_center_id },
32-
{ $set: { sell_map_center: sellMapCenter } },
33-
{ new: true }
34-
).exec();
35-
36-
if (updatedSeller) {
37-
logger.info(`Seller's sell_map_center updated for seller_id: ${map_center_id}`, { updatedSeller });
38-
} else {
39-
logger.warn(`Seller not found for seller_id: ${map_center_id}. sell_map_center not updated.`);
40-
return res.status(404).json({ message: 'Seller not found: Map Center failed to save' });
41-
}
42-
}
43-
return res.status(200).json(mapCenter);
44-
23+
return res.status(200).json({uid: map_center_id, map_center: mapCenter});
4524
} catch (error: any) {
4625
logger.error('Failed to save Map Center:', {
4726
message: error.message,
@@ -55,8 +34,9 @@ export const saveMapCenter = async (req: Request, res: Response) => {
5534
export const getMapCenter = async (req: Request, res: Response) => {
5635
try {
5736
const map_center_id = req.currentUser?.pi_uid;
37+
const {type} = req.params;
5838
if (map_center_id) {
59-
const mapCenter: IMapCenter | null = await mapCenterService.getMapCenterById(map_center_id);
39+
const mapCenter: IMapCenter | null = await mapCenterService.getMapCenterById(map_center_id, type);
6040
if (!mapCenter) {
6141
logger.warn(`Map Center not found for user ${map_center_id}`);
6242
return res.status(404).json({ message: "Map Center not found" });

backend/src/controllers/sellerController.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const fetchSellersByCriteria = async (req: Request, res: Response) => {
99
try {
1010
const { origin, radius, search_query } = req.body;
1111
const sellers = await sellerService.getAllSellers(origin, radius, search_query);
12-
const originString = origin ? `(${origin.lng}, ${origin.lat})` : 'undefined';
12+
const originString = origin ? `(${origin.lat}, ${origin.lng})` : 'undefined';
1313

1414
if (!sellers || sellers.length === 0) {
1515
logger.warn(`No sellers found within ${radius ?? 'undefined'} km of ${originString} with "${search_query ?? 'undefined'}"`);

backend/src/controllers/userPreferencesController.ts

+26
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,29 @@ export const deleteUserPreferences = async (req: Request, res: Response) => {
8888
return res.status(500).json({ message: 'An error occurred while deleting user preferences; please try again later' });
8989
}
9090
};
91+
92+
export const getUserLocation = async (req: Request, res: Response) => {
93+
let origin: { lat: number; lng: number };
94+
95+
// Default map center (example: New York City)
96+
const defaultMapCenter: { lat: number; lng: number } = { lat: 20, lng: -74.006 };
97+
try {
98+
const authUser = req.currentUser;
99+
const radius = 15;
100+
if (authUser) {
101+
let location = await userSettingsService.userLocation(authUser?.pi_uid);
102+
origin = location? location: defaultMapCenter;
103+
logger.info('origin from backend:', origin)
104+
} else {
105+
origin = defaultMapCenter;
106+
}
107+
return res.status(200).json({ origin: origin, radius: radius });
108+
} catch (error: any) {
109+
logger.error(`Failed to get user location for piUID ${ req.currentUser?.pi_uid }:`, {
110+
message: error.message,
111+
config: error.config,
112+
stack: error.stack
113+
});
114+
return res.status(500).json({ message: 'An error occurred while getting user location; please try again later' });
115+
}
116+
};

backend/src/models/MapCenter.ts

-38
This file was deleted.

backend/src/models/Seller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
},
1717
seller_type: {
1818
type: String,
19-
enum: Object.values(SellerType),
19+
enum: Object.values(SellerType).filter(value => typeof value === 'string'),
2020
required: true,
2121
default: SellerType.Test,
2222
},

backend/src/models/UserSettings.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import mongoose, { Schema } from "mongoose";
22

33
import { IUserSettings } from "../types";
4+
import { DeviceLocationType } from "./enums/deviceLocationType";
45
import { TrustMeterScale } from "./enums/trustMeterScale";
56

67
const userSettingsSchema = new Schema<IUserSettings>(
@@ -25,11 +26,13 @@ const userSettingsSchema = new Schema<IUserSettings>(
2526
image: {
2627
type: String,
2728
required: false,
29+
default: ''
2830
},
2931
findme: {
3032
type: String,
33+
enum: Object.values(DeviceLocationType).filter(value => typeof value === 'string'),
3134
required: true,
32-
default: 'deviceGPS'
35+
default: DeviceLocationType.Automatic
3336
},
3437
trust_meter_rating: {
3538
type: Number,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export enum DeviceLocationType {
2+
Automatic = 'auto',
3+
GPS = 'deviceGPS',
4+
SearchCenter = 'searchCenter'
5+
}
6+

backend/src/routes/mapCenter.routes.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ const mapCenterRoutes = Router();
2323

2424
/**
2525
* @swagger
26-
* /api/v1/map-center:
26+
* /api/v1/map-center/{type}:
2727
* get:
2828
* tags:
2929
* - Map Center
30-
* summary: Get the user's map center *
30+
* summary: Get the user's map center by type *
31+
* parameters:
32+
* - name: type
33+
* in: path
34+
* required: true
35+
* schema:
36+
* type: string
37+
* description: The type of the map center to retrieve
3138
* responses:
3239
* 200:
3340
* description: Successful response
@@ -45,7 +52,7 @@ const mapCenterRoutes = Router();
4552
* description: Internal server error
4653
*/
4754
mapCenterRoutes.get(
48-
'/',
55+
'/:type',
4956
verifyToken,
5057
mapCenterController.getMapCenter
5158
);

backend/src/routes/userPreferences.routes.ts

+29-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ userPreferencesRoutes.post(
107107
isUserSettingsFound,
108108
userPreferencesController.fetchUserPreferences);
109109

110-
/**
110+
/**
111111
* @swagger
112112
* /api/v1/user-preferences/add:
113113
* put:
@@ -178,4 +178,31 @@ userPreferencesRoutes.delete(
178178
userPreferencesController.deleteUserPreferences
179179
);
180180

181-
export default userPreferencesRoutes;
181+
/**
182+
* @swagger
183+
* /api/v1/user-preferences/location/me:
184+
* get:
185+
* tags:
186+
* - User Preferences
187+
* summary: Fetch the user's current location using Bearer Auth token *
188+
* responses:
189+
* 200:
190+
* description: Successful response
191+
* content:
192+
* application/json:
193+
* schema:
194+
* $ref: '/api/docs/UserPreferencesSchema.yml#/components/schemas/GetUserLocationRs'
195+
* 401:
196+
* description: Unauthorized | Authentication token is required | Authentication token is invalid or expired
197+
* 400:
198+
* description: Bad request
199+
* 500:
200+
* description: Internal server error
201+
*/
202+
userPreferencesRoutes.get(
203+
'/location/me',
204+
verifyToken,
205+
userPreferencesController.getUserLocation
206+
)
207+
208+
export default userPreferencesRoutes;

0 commit comments

Comments
 (0)