Skip to content

Commit 3c0028a

Browse files
authored
fix: lock
1 parent 24e4bf7 commit 3c0028a

File tree

1 file changed

+24
-13
lines changed
  • packages/gin/challenge-1-basic-routing/submissions/shansing

1 file changed

+24
-13
lines changed

packages/gin/challenge-1-basic-routing/submissions/shansing/solution.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ var usersLock sync.RWMutex
5656
var nextID = 4
5757
var nextIdLock sync.Mutex
5858

59-
func withUsersLock(fn func()) {
60-
usersLock.Lock()
61-
defer usersLock.Unlock()
62-
fn()
63-
}
6459
func withNextId(fn func(int)) {
6560
nextIdLock.Lock()
6661
defer nextIdLock.Unlock()
@@ -93,6 +88,9 @@ func main() {
9388

9489
// getAllUsers handles GET /users
9590
func getAllUsers(c *gin.Context) {
91+
usersLock.RLock()
92+
defer usersLock.RUnlock()
93+
9694
c.JSON(http.StatusOK, ResponseSuccess(users, http.StatusOK))
9795
}
9896

@@ -104,6 +102,9 @@ func getUserByID(c *gin.Context) {
104102
c.JSON(http.StatusBadRequest, ResponseFailure(fmt.Sprintf("id is not number: %s", err), http.StatusBadRequest))
105103
return
106104
}
105+
106+
usersLock.RLock()
107+
defer usersLock.RUnlock()
107108
// Return 404 if user not found
108109
var user *User
109110
if user, _ = findUserByID(id); user == nil {
@@ -127,6 +128,9 @@ func createUser(c *gin.Context) {
127128
return
128129
}
129130
// Add user to storage
131+
usersLock.Lock()
132+
defer usersLock.Unlock()
133+
130134
var newUser User
131135
withNextId(func(nextId int) {
132136
newUser = User{
@@ -135,17 +139,15 @@ func createUser(c *gin.Context) {
135139
Email: userParam.Email,
136140
Age: userParam.Age,
137141
}
138-
withUsersLock(func() {
139-
users = append(users, newUser)
140-
})
142+
users = append(users, newUser)
141143
})
142144
// Return created user
143145
c.JSON(201, ResponseSuccess(newUser, 201))
144146
}
145147

146148
// updateUser handles PUT /users/:id
147149
func updateUser(c *gin.Context) {
148-
// Get return ser ID from path
150+
// Get return user ID from path
149151
id, err := strconv.Atoi(c.Param("id"))
150152
if err != nil {
151153
c.JSON(http.StatusBadRequest, ResponseFailure(fmt.Sprintf("id is not number: %s", err), http.StatusBadRequest))
@@ -162,6 +164,9 @@ func updateUser(c *gin.Context) {
162164
return
163165
}
164166
// Find and update user
167+
usersLock.Lock()
168+
defer usersLock.Unlock()
169+
165170
user, _ := findUserByID(id)
166171
if user == nil {
167172
c.JSON(http.StatusNotFound, ResponseFailure("user not found", http.StatusNotFound))
@@ -186,18 +191,20 @@ func deleteUser(c *gin.Context) {
186191
id, err := strconv.Atoi(c.Param("id"))
187192
if err != nil {
188193
c.JSON(http.StatusBadRequest, ResponseFailure(fmt.Sprintf("id is not number: %s", err), http.StatusBadRequest))
194+
return
189195
}
190196
// Find and remove user
197+
usersLock.Lock()
198+
defer usersLock.Unlock()
199+
191200
_, i := findUserByID(id)
192201
if i < 0 {
193202
c.JSON(http.StatusNotFound, ResponseFailure("user not found", http.StatusNotFound))
194203
return
195204
}
205+
users = append(users[:i], users[i+1:]...)
196206
// Return success message
197-
withUsersLock(func() {
198-
users = append(users[:i], users[i+1:]...)
199-
})
200-
c.JSON(http.StatusOK, ResponseSuccess(users, 200))
207+
c.JSON(http.StatusOK, ResponseSuccess(nil, 200))
201208
}
202209

203210
// searchUsers handles GET /users/search?name=value
@@ -211,6 +218,10 @@ func searchUsers(c *gin.Context) {
211218
nameParam = strings.ToLower(nameParam)
212219
// Filter users by name (case-insensitive)
213220
nameUsers := make([]User, 0)
221+
222+
usersLock.RLock()
223+
defer usersLock.RUnlock()
224+
214225
for _, user := range users {
215226
if strings.Contains(strings.ToLower(user.Name), nameParam) {
216227
nameUsers = append(nameUsers, user)

0 commit comments

Comments
 (0)