@@ -56,11 +56,6 @@ var usersLock sync.RWMutex
5656var nextID = 4
5757var nextIdLock sync.Mutex
5858
59- func withUsersLock (fn func ()) {
60- usersLock .Lock ()
61- defer usersLock .Unlock ()
62- fn ()
63- }
6459func withNextId (fn func (int )) {
6560 nextIdLock .Lock ()
6661 defer nextIdLock .Unlock ()
@@ -93,6 +88,9 @@ func main() {
9388
9489// getAllUsers handles GET /users
9590func 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
147149func 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