2022-07-15 11:49:53 +00:00
|
|
|
/*
|
2022-07-16 15:46:09 +00:00
|
|
|
Copyright © 2022 Matthieu Derasse <git@derasse.fr>
|
2022-07-15 11:49:53 +00:00
|
|
|
|
|
|
|
*/
|
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2022-07-16 22:16:29 +00:00
|
|
|
"os"
|
2022-08-02 20:30:46 +00:00
|
|
|
"path/filepath"
|
2022-07-25 20:20:10 +00:00
|
|
|
"strings"
|
2022-07-16 22:16:29 +00:00
|
|
|
|
2022-08-01 19:47:46 +00:00
|
|
|
"github.com/juju/errors"
|
2022-07-15 11:49:53 +00:00
|
|
|
"github.com/spf13/cobra"
|
|
|
|
|
2022-08-01 19:47:46 +00:00
|
|
|
"git.home.m-and-m.ovh/mderasse/gouick/helpers"
|
|
|
|
"git.home.m-and-m.ovh/mderasse/gouick/helpers/api_types"
|
|
|
|
"git.home.m-and-m.ovh/mderasse/gouick/helpers/models"
|
|
|
|
|
2022-07-15 11:49:53 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// initCmd represents the init command
|
|
|
|
var initCmd = &cobra.Command{
|
|
|
|
Use: "init",
|
|
|
|
Short: "Initialize a new project",
|
|
|
|
Long: `Initialize a new project by creating a new directory and:
|
|
|
|
- Initialize a Git Repository
|
|
|
|
- Create a Go-Swagger Struct
|
|
|
|
- Add default routes
|
|
|
|
- Generate the API.
|
|
|
|
|
|
|
|
That command is Interactive or can be control through args`,
|
|
|
|
Run: runInitAction,
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
rootCmd.AddCommand(initCmd)
|
|
|
|
}
|
|
|
|
|
2022-07-16 22:16:29 +00:00
|
|
|
// runInitAction
|
|
|
|
// Steps:
|
|
|
|
// 1 - Check that we have the dependencies
|
|
|
|
// 2 - Check that we are not in project directory
|
|
|
|
// 3 - Ask info to the user
|
2022-07-15 11:49:53 +00:00
|
|
|
func runInitAction(cmd *cobra.Command, args []string) {
|
|
|
|
|
|
|
|
log.Debugf("Starting command Init")
|
|
|
|
|
2022-07-25 20:20:10 +00:00
|
|
|
log.Debugf("Checking dependencies")
|
2022-07-15 11:49:53 +00:00
|
|
|
|
2022-07-16 22:16:29 +00:00
|
|
|
if !checkDependencies() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get current path
|
|
|
|
currentPath, err := os.Getwd()
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Fail to get current path. The following error happen: %s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Debugf("Working in directory: %s", currentPath)
|
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
// Check if we are in gouick directory
|
|
|
|
log.Debug("Checking if we are in the same directory as Gouick")
|
2022-07-16 22:16:29 +00:00
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
isGouickDir, err := helpers.IsGouickDirectory(currentPath)
|
2022-07-16 22:16:29 +00:00
|
|
|
if err != nil {
|
2022-07-25 20:43:53 +00:00
|
|
|
log.Errorf("Fail to check if we are in gouick directory. The following error happen: %s", err.Error())
|
2022-07-16 22:16:29 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
if isGouickDir {
|
|
|
|
log.Error("You cannot initialize a new project in the same dir than gouick\nGouick should be added to your path")
|
2022-07-16 22:16:29 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
// Check if we are in a gouick project
|
|
|
|
log.Debug("Checking if we are in a gouick project")
|
2022-07-16 22:16:29 +00:00
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
isGouickProject, err := helpers.IsGouickProject(currentPath)
|
2022-07-16 22:16:29 +00:00
|
|
|
if err != nil {
|
2022-07-25 20:43:53 +00:00
|
|
|
log.Errorf("Fail to check if we are in a gouick project. The following error happen: %s", err.Error())
|
2022-07-16 22:16:29 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-07-25 20:43:53 +00:00
|
|
|
if isGouickProject {
|
|
|
|
log.Error("You cannot initialize a new project in an already gouick project")
|
2022-07-16 22:16:29 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-07-25 20:20:10 +00:00
|
|
|
// ask which API type we want to use
|
|
|
|
var possibleApiTypes []string
|
2022-08-01 19:47:46 +00:00
|
|
|
for _, apiType := range models.GetListOfApiTypeName() {
|
2022-07-25 20:20:10 +00:00
|
|
|
possibleApiTypes = append(possibleApiTypes, string(apiType))
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Infof("Which kind of API do you want to init (possible values: %s)", strings.Join(possibleApiTypes, ", "))
|
2022-07-25 20:57:00 +00:00
|
|
|
apiTypeName := helpers.ApiTypeNameInput()
|
|
|
|
|
|
|
|
log.Debugf("Using api type : %s", string(apiTypeName))
|
|
|
|
|
2022-08-01 19:47:46 +00:00
|
|
|
apiType, err := api_types.GetApiType(apiTypeName)
|
2022-07-25 20:57:00 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Error("Impossible to load that API Type generator")
|
|
|
|
}
|
2022-07-25 20:20:10 +00:00
|
|
|
|
2022-08-01 21:55:50 +00:00
|
|
|
log.Debug("Check before init for the selected API type")
|
|
|
|
|
|
|
|
err = apiType.CheckInitialize()
|
|
|
|
if err != nil && !errors.Is(err, errors.NotImplemented) {
|
|
|
|
log.Errorf("Impossible to initialize the project. The following error happen: %s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize a default userInput
|
|
|
|
userInput := models.UserInputParams{}
|
|
|
|
|
|
|
|
// ask project directory
|
|
|
|
log.Info("Name of the project directory:")
|
|
|
|
userInput.ProjectDirectory = helpers.AlphanumericalInput()
|
|
|
|
|
|
|
|
// ask project name
|
|
|
|
log.Info("Name of the project:")
|
|
|
|
userInput.ProjectName = helpers.StringInput()
|
|
|
|
|
|
|
|
// ask project description
|
|
|
|
log.Info("Description of the project:")
|
|
|
|
userInput.ProjectDescription = helpers.StringInput()
|
|
|
|
|
|
|
|
// ask project owner
|
|
|
|
log.Info("Mail address of the developer team:")
|
|
|
|
userInput.ProjectOwner = helpers.StringInput()
|
|
|
|
|
2022-08-01 19:47:46 +00:00
|
|
|
// launch GetInitializeUserInput from selected api type
|
|
|
|
log.Debug("Get user input for the selected API type")
|
|
|
|
|
2022-08-01 21:55:50 +00:00
|
|
|
_, err = apiType.GetInitializeUserInput(&userInput)
|
2022-08-01 19:47:46 +00:00
|
|
|
if err != nil && !errors.Is(err, errors.NotImplemented) {
|
|
|
|
log.Errorf("Fail to get all the required input. The following error happen: %s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-08-02 20:30:46 +00:00
|
|
|
projectDirPath := filepath.Join(currentPath, userInput.ProjectDirectory)
|
|
|
|
|
|
|
|
log.Debugf("Our project directory path is: %s", projectDirPath)
|
|
|
|
|
|
|
|
// create project directory
|
|
|
|
log.Debug("Creating project directory")
|
|
|
|
|
|
|
|
dirCreated, err := helpers.CheckAndCreateDir(projectDirPath)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Fail to create project directory. The following error happen: %s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if !dirCreated {
|
|
|
|
log.Error("A directory already exist with your project directory name")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// move to project directory
|
|
|
|
err = os.Chdir(projectDirPath)
|
|
|
|
if err != nil {
|
|
|
|
log.Errorf("Fail to move to project directory. The following error happen: %s", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-07-16 22:16:29 +00:00
|
|
|
// XXX:
|
|
|
|
// git init
|
2022-07-25 20:43:53 +00:00
|
|
|
// create .gouick
|
2022-07-16 22:16:29 +00:00
|
|
|
// move templated file
|
2022-07-15 11:49:53 +00:00
|
|
|
}
|