@@ -19,6 +19,9 @@ class TeamsController: Controller {
1919 /// Error
2020 enum Error : FrontendError {
2121
22+ /// User has not been found
23+ case singleTeamConfiguration
24+
2225 /// User has not been found
2326 case userNotFound
2427
@@ -41,6 +44,8 @@ class TeamsController: Controller {
4144 /// Erro code
4245 var identifier : String {
4346 switch self {
47+ case . singleTeamConfiguration:
48+ return " team_error.single_team_configuration "
4449 case . userNotFound:
4550 return " team_error.user_not_found "
4651 case . cantAddYourself:
@@ -59,6 +64,8 @@ class TeamsController: Controller {
5964 /// Error reason
6065 var reason : String {
6166 switch self {
67+ case . singleTeamConfiguration:
68+ return " Server is running in a single team configuration "
6269 case . userNotFound:
6370 return " User not found "
6471 case . cantAddYourself:
@@ -93,19 +100,22 @@ class TeamsController: Controller {
93100
94101 /// Setup routes
95102 static func boot( router: Router ) throws {
96- router. get ( " teams " ) { ( req) -> Future < [ Team ] > in
103+ router. get ( " teams " ) { req -> Future < [ Team ] > in
97104 let me = try req. me. user ( )
98105 return try me. teams. query ( on: req) . paginate ( on: req) . all ( ) . map ( { teams in
99106 return teams
100107 } )
101108 }
102109
103- router. get ( " teams " , DbIdentifier . parameter) { ( req) -> Future < Team > in
110+ router. get ( " teams " , DbIdentifier . parameter) { req -> Future < Team > in
104111 let id = try req. parameters. next ( DbIdentifier . self)
105112 return try req. me. verifiedTeam ( id: id)
106113 }
107114
108- router. post ( " teams " ) { ( req) -> Future < Response > in
115+ router. post ( " teams " ) { req -> Future < Response > in
116+ guard ApiCoreBase . configuration. general. singleTeam == false else {
117+ throw Error . singleTeamConfiguration
118+ }
109119 return try req. content. decode ( Team . New. self) . flatMap ( to: Response . self) { newTeam in
110120 return try Team . exists ( identifier: newTeam. identifier, on: req) . flatMap ( to: Response . self) { identifierExists in
111121 if identifierExists {
@@ -124,7 +134,10 @@ class TeamsController: Controller {
124134 }
125135 }
126136
127- router. post ( " teams " , " check " ) { ( req) -> Future < Response > in
137+ router. post ( " teams " , " check " ) { req -> Future < Response > in
138+ guard ApiCoreBase . configuration. general. singleTeam == false else {
139+ throw Error . singleTeamConfiguration
140+ }
128141 return try req. content. decode ( Team . Identifier. self) . flatMap ( to: Response . self) { identifierObject in
129142 return try Team . exists ( identifier: identifierObject. identifier, on: req) . map ( to: Response . self) { identifierExists in
130143 if identifierExists {
@@ -135,7 +148,10 @@ class TeamsController: Controller {
135148 }
136149 }
137150
138- router. put ( " teams " , DbIdentifier . parameter) { ( req) -> Future < Team > in
151+ router. put ( " teams " , DbIdentifier . parameter) { req -> Future < Team > in
152+ guard ApiCoreBase . configuration. general. singleTeam == false else {
153+ throw Error . singleTeamConfiguration
154+ }
139155 let id = try req. parameters. next ( DbIdentifier . self)
140156 return try req. me. verifiedTeam ( id: id) . flatMap ( to: Team . self, { team in
141157 return try req. content. decode ( Team . New. self) . flatMap ( to: Team . self) { newTeam in
@@ -166,26 +182,46 @@ class TeamsController: Controller {
166182 }
167183 }
168184
169- router. get ( " teams " , DbIdentifier . parameter, " users " ) { ( req) -> Future < [ User ] > in
185+ router. get ( " teams " , DbIdentifier . parameter, " users " ) { req -> Future < [ User ] > in
170186 let id = try req. parameters. next ( DbIdentifier . self)
171187 return try req. me. verifiedTeam ( id: id) . flatMap ( to: [ User ] . self) { ( team) -> Future < [ User ] > in
172188 return try team. users. query ( on: req) . paginate ( on: req) . all ( )
173189 }
174190 }
175191
176- router. post ( " teams " , DbIdentifier . parameter, " link " ) { ( req) -> Future < Response > in
192+ router. post ( " teams " , DbIdentifier . parameter, " link " ) { req -> Future < Response > in
193+ guard ApiCoreBase . configuration. general. singleTeam == false else {
194+ throw Error . singleTeamConfiguration
195+ }
177196 return try processLinking ( request: req, action: . link)
178197 }
179198
180- router. post ( " teams " , DbIdentifier . parameter, " unlink " ) { ( req) -> Future < Response > in
199+ router. post ( " teams " , DbIdentifier . parameter, " unlink " ) { req -> Future < Response > in
200+ guard ApiCoreBase . configuration. general. singleTeam == false else {
201+ throw Error . singleTeamConfiguration
202+ }
181203 return try processLinking ( request: req, action: . unlink)
182204 }
183205
184- router. delete ( " teams " , DbIdentifier . parameter) { ( req) -> Future < Response > in
206+ router. delete ( " teams " , DbIdentifier . parameter) { req -> Future < Response > in
207+ guard ApiCoreBase . configuration. general. singleTeam == false else {
208+ throw Error . singleTeamConfiguration
209+ }
185210 // TODO: Reload JWT token if successful with new info
186211 // QUESTION: Should we make sure user has at least one team?
187212 let teamId = try req. parameters. next ( DbIdentifier . self)
188213 return try req. me. verifiedTeam ( id: teamId) . flatMap ( to: Response . self) { ( team) -> Future < Response > in
214+ // Common delete function
215+ func delete( team: Team , request req: Request ) throws -> Future < Response > {
216+ if team. admin {
217+ throw Error . unableToDeleteAdminTeam
218+ }
219+ // TODO: Cascade through all team data (that is not shared with other teams, possibly delete users too?) !!!!!!
220+ return team. delete ( on: req) . map ( to: Response . self, { ( _) -> Response in
221+ return try req. response. deleted ( )
222+ } )
223+ }
224+
189225 if let canDelete = ApiCoreBase . deleteTeamWarning {
190226 return canDelete ( team) . flatMap ( to: Response . self, { ( error) -> Future < Response > in
191227 guard let error = error else {
@@ -206,17 +242,6 @@ class TeamsController: Controller {
206242
207243extension TeamsController {
208244
209- /// Delete team
210- private static func delete( team: Team , request req: Request ) throws -> Future < Response > {
211- if team. admin {
212- throw Error . unableToDeleteAdminTeam
213- }
214- // TODO: Cascade through all team data (that is not shared with other teams, possibly delete users too?) !!!!!!
215- return team. delete ( on: req) . map ( to: Response . self, { ( _) -> Response in
216- return try req. response. deleted ( )
217- } )
218- }
219-
220245 /// Process linking from a request
221246 private static func processLinking( request req: Request , action: TeamsController . LinkAction ) throws -> Future < Response > {
222247 let teamId = try req. parameters. next ( DbIdentifier . self)
0 commit comments