aboutsummaryrefslogtreecommitdiffstats
path: root/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java
blob: 52e64a95bdd116fe9edfaa5ad3f47535a16b09f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*
 *  ============LICENSE_START=======================================================
 *  Copyright (C) 2020 Nordix Foundation
 *  Modifications Copyright (C) 2020-2021 Bell Canada.
 *  Modifications Copyright (C) 2021 Pantheon.tech
 *  ================================================================================
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *  SPDX-License-Identifier: Apache-2.0
 *  ============LICENSE_END=========================================================
 */

package org.onap.cps.rest.controller;

import static org.onap.cps.rest.utils.MultipartFileUtil.extractYangResourcesMap;
import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.modelmapper.ModelMapper;
import org.onap.cps.api.CpsAdminService;
import org.onap.cps.api.CpsModuleService;
import org.onap.cps.rest.api.CpsAdminApi;
import org.onap.cps.rest.model.AnchorDetails;
import org.onap.cps.rest.model.SchemaSetDetails;
import org.onap.cps.spi.model.Anchor;
import org.onap.cps.spi.model.SchemaSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("${rest.api.cps-base-path}")
public class AdminRestController implements CpsAdminApi {

    @Autowired
    private CpsAdminService cpsAdminService;

    @Autowired
    private CpsModuleService cpsModuleService;

    @Autowired
    private ModelMapper modelMapper;

    /**
     * Create a dataspace.
     *
     * @param dataspaceName dataspace name
     * @return a {@Link ResponseEntity} of created dataspace name & {@link HttpStatus} CREATED
     */
    @Override
    public ResponseEntity<String> createDataspace(@NotNull @Valid final String dataspaceName) {
        cpsAdminService.createDataspace(dataspaceName);
        return new ResponseEntity<>(dataspaceName, HttpStatus.CREATED);
    }

    /**
     * Delete a dataspace.
     *
     * @param dataspaceName name of dataspace to be deleted
     * @return a {@Link ResponseEntity} of {@link HttpStatus} NO_CONTENT
     */
    @Override
    public ResponseEntity<Void> deleteDataspace(final String dataspaceName) {
        cpsAdminService.deleteDataspace(dataspaceName);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    /**
     * Create a {@link SchemaSet}.
     *
     * @param multipartFile multipart file
     * @param schemaSetName schemaset name
     * @param dataspaceName dataspace name
     * @return a {@Link ResponseEntity} of created schemaset name & {@link HttpStatus} CREATED
     */
    @Override
    public ResponseEntity<String> createSchemaSet(@NotNull @Valid final String schemaSetName,
        final String dataspaceName, @Valid final MultipartFile multipartFile) {
        cpsModuleService.createSchemaSet(dataspaceName, schemaSetName, extractYangResourcesMap(multipartFile));
        return new ResponseEntity<>(schemaSetName, HttpStatus.CREATED);
    }

    /**
     * Get {@link SchemaSetDetails} based on dataspace name & {@link SchemaSet} name.
     *
     * @param dataspaceName dataspace name
     * @param schemaSetName schemaset name
     * @return a {@Link ResponseEntity} of {@Link SchemaSetDetails} & {@link HttpStatus} OK
     */
    @Override
    public ResponseEntity<SchemaSetDetails> getSchemaSet(final String dataspaceName, final String schemaSetName) {
        final var schemaSet = cpsModuleService.getSchemaSet(dataspaceName, schemaSetName);
        final var schemaSetDetails = modelMapper.map(schemaSet, SchemaSetDetails.class);
        return new ResponseEntity<>(schemaSetDetails, HttpStatus.OK);
    }

    /**
     * Delete a {@link SchemaSet} based on given dataspace name & schemaset name.
     *
     * @param dataspaceName dataspace name
     * @param schemaSetName schemaset name
     * @return a {@Link ResponseEntity} of {@link HttpStatus} NO_CONTENT
     */
    @Override
    public ResponseEntity<Void> deleteSchemaSet(final String dataspaceName, final String schemaSetName) {
        cpsModuleService.deleteSchemaSet(dataspaceName, schemaSetName, CASCADE_DELETE_PROHIBITED);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    /**
     * Create a new anchor.
     *
     * @param dataspaceName dataspace name
     * @param schemaSetName schema set name
     * @param anchorName    anchorName
     * @return a ResponseEntity with the anchor name & {@link HttpStatus} CREATED
     */
    @Override
    public ResponseEntity<String> createAnchor(final String dataspaceName, @NotNull @Valid final String schemaSetName,
        @NotNull @Valid final String anchorName) {
        cpsAdminService.createAnchor(dataspaceName, schemaSetName, anchorName);
        return new ResponseEntity<>(anchorName, HttpStatus.CREATED);
    }

    /**
     * Delete an {@link Anchor} based on given dataspace name & anchor name.
     *
     * @param dataspaceName dataspace name
     * @param anchorName anchor name
     * @return a {@Link ResponseEntity} of {@link HttpStatus} NO_CONTENT
     */
    @Override
    public ResponseEntity<Void> deleteAnchor(final String dataspaceName, final String anchorName) {
        cpsAdminService.deleteAnchor(dataspaceName, anchorName);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    /**
     * Get an {@link Anchor} based on given dataspace name & anchor name.
     *
     * @param dataspaceName dataspace name
     * @param anchorName anchor name
     * @return a {@Link ResponseEntity} of an {@Link AnchorDetails} & {@link HttpStatus} OK
     */
    @Override
    public ResponseEntity<AnchorDetails> getAnchor(final String dataspaceName, final String anchorName) {
        final var anchor = cpsAdminService.getAnchor(dataspaceName, anchorName);
        final var anchorDetails = modelMapper.map(anchor, AnchorDetails.class);
        return new ResponseEntity<>(anchorDetails, HttpStatus.OK);
    }

    /**
     *  Get all {@link Anchor} based on given dataspace name.
     *
     * @param dataspaceName dataspace name
     * @return a {@Link ResponseEntity} of all {@Link AnchorDetails} & {@link HttpStatus} OK
     */
    @Override
    public ResponseEntity<List<AnchorDetails>> getAnchors(final String dataspaceName) {
        final Collection<Anchor> anchors = cpsAdminService.getAnchors(dataspaceName);
        final List<AnchorDetails> anchorDetails = anchors.stream().map(anchor ->
            modelMapper.map(anchor, AnchorDetails.class)).collect(Collectors.toList());
        return new ResponseEntity<>(anchorDetails, HttpStatus.OK);
    }
}