1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace App\Http\Controllers\InterOp;
7
8use App\Exceptions\ModelNotSavedException;
9use App\Exceptions\ValidationException;
10use App\Http\Controllers\Controller;
11use App\Libraries\UserRegistration;
12use App\Models\Beatmap;
13use App\Models\User;
14use App\Models\UserAchievement;
15use App\Transformers\CurrentUserTransformer;
16
17class UsersController extends Controller
18{
19 public function achievement($id, $achievementId, $beatmapId = null)
20 {
21 $achievement = app('medals')->byIdOrFail($achievementId);
22 $unlocked = UserAchievement::unlock(
23 User::findOrFail($id),
24 $achievement,
25 Beatmap::find($beatmapId),
26 );
27
28 abort_unless($unlocked, 422, 'user already unlocked the specified achievement');
29
30 datadog_increment('user_achievement_unlock', ['id' => $achievementId]);
31
32 return $achievement->getKey();
33 }
34
35 public function store()
36 {
37 $request = request()->all();
38 $params = get_params($request, 'user', ['username', 'user_email', 'group', 'password', 'country_acronym']);
39 $params['user_ip'] = '127.0.0.1';
40 $params['country_acronym'] = $params['country_acronym'] ?? request_country() ?? '';
41
42 if (isset($request['source_user_id'])) {
43 $sourceUser = User::find($request['source_user_id']);
44
45 if ($sourceUser === null) {
46 abort(404, "Can't find User specified in source_user_id");
47 }
48
49 if (!isset($params['user_email']) && isset($params['username'])) {
50 $sourceEmailParts = explode('@', $sourceUser->user_email);
51 $params['user_email'] = "{$sourceEmailParts[0]}+{$params['username']}@{$sourceEmailParts[1]}";
52 }
53 $params['country_acronym'] = $sourceUser->country_acronym ?? '';
54 $params['user_ip'] = $sourceUser->user_ip;
55 $params['user_password'] = $sourceUser->user_password;
56 }
57
58 $registration = new UserRegistration($params);
59
60 try {
61 $registration->save();
62
63 return json_item($registration->user()->fresh(), new CurrentUserTransformer());
64 } catch (ValidationException $ex) {
65 return ModelNotSavedException::makeResponse($ex, [
66 'user' => $registration->user(),
67 ]);
68 }
69 }
70}